Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор

Приклад роботи знаходиться у папці DISK\dialog\dialog6.

Створимо програму з такими елементами керування як: лінійний регулятор (CSliderCtrl), лінійний індикатор (CProgressCtrl) та інкрементний регулятор (CSpinCtrl). Уявимо що ця програма використовується для регулювання напруги у деякому пристрої. Створимо структуру napr у якій буде зберігатись напруга та швидкість її зміни:

struct napr

{

int volt;

int skor;

};

У класі діалогу додамо змінну створену на основі цієї структури:

class CDialDoc : public CDocument

{

.............................................................

public:

napr vol;

.............................................................

};

Створимо клас Dia, у якому буде розміщено зазначені вище елементи керування. Результат роботи програми приведено на рис. 8.11:

class Dia : public CDialog

{

// Construction

public:

Dia(); // standard constructor

CDialDoc* doc;

// Dialog Data

//{{AFX_DATA(Dia)

enum { IDD = IDD_DIALOG1 };

CSliderCtrl m_slid;

CProgressCtrl m_prog;

CString m_edit;

CString m_edit_zn;

//}}AFX_DATA

.............................................................

};

Рис. 8.11. Результат роботи програми

Змінна m_edit буде містити числове значення для автоматичної зміни напруги. Значення напруги буде виводитись у змінну m_edit_zn. У діалозі будемо періодично змінювати положення елементів керування. Для цього створимо таймер функцією SetTimer (для видалення таймера використовується функція KillTimer). Таймер закріплюється за певним вікном, а операційна система генерує події WM_TIMER для вікон з таймерами. Додамо функцію OnTimer, яка буде реагувати на періодично створювані системою події WM_TIMER:

void Dia::OnTimer(UINT nIDEvent)

{

m_slid.SetPos(m_slid.GetPos() + 10);

CDialog::OnTimer(nIDEvent);

SendMessage(WM_HSCROLL);

}

У функції ми змінюємо позицію лінійного регулятора через вказівку m_slid. Функція GetPos із класу CSliderCtrl повертає позицію елемента, а SetPos встановлює нову позицію. Для синхронізації зміни лінійного регулятора із іншими елементами керування розташованими у вікні діалогу ми викликаємо функцію SendMessage із параметром WM_HSCROLL для виклику функції OnHScroll:

void Dia::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

CString vrem;

vrem.Format("%d вольт",m_slid.GetPos());

SetWindowText("Напряжение = " + vrem);

m_edit_zn = vrem;

UpdateData(false);

CRect rec, rec_tec;

CClientDC client(this);

CBrush br(RGB(255,0,0));

CBrush br_os(RGB(255,255,255));

m_prog.SetPos(m_slid.GetPos());

::GetWindowRect(::GetDlgItem(m_hWnd,IDC_PICTURE),&rec);

ScreenToClient(&rec);

rec_tec = rec;

rec_tec.right = rec.left + rec.Width() * m_slid.GetPos() / m_slid.GetRangeMax();

client.FillRect(rec,&br_os);

client.FillRect(rec_tec,&br);

if(m_slid.GetPos() > 0)

((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(0);

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

У змінній vrem формується заголовок для вікна діалогу. Встановлення заголовку для вікна робиться функцією SetWindowText. Позиція лінійного індикатора змінюється через вказівку m_prog функцією SetPos із класу CProgressCtrl. У елементі керування IDC_PICTURE ми намалюємо позицію самостійно. Прямокутник rec буде займати всю область вікна елемента IDC_PICTURE а rec_tec лише область, що буде показувати рівень напруги. Створимо пензлик br_os для малювання фону а також пензлик br для малювання рівня поточної напруги. Функцією FillRect малюються 2 прямокутника rec і rec_tec. Функція SetCheck з параметром 0 очищує прапорець IDC_CHECK1.

Як зазначалось вище автоматична зміна напруги за таймером буде виконуватись в залежності від значення m_edit. Створимо елемент керування інкриментний регулятор для зміни значення m_edit, додамо функцію OnDeltaposSpin1 для контролю за цим елементом:

void Dia::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;

int a = atoi(m_edit);

a = a - pNMUpDown->iDelta*10;

if (a > -1 && a < 110)

{

m_edit.Format("%d",a);

UpdateData(0);

}

KillTimer(1);

if(a)SetTimer(1,10000/a,0);

*pResult = 0;

}

Спочатку ми перетворюємо значення змінної m_edit у число a типу int. Потім змінюємо значення a. Якщо значення a знаходиться у допустимих межах тоді перетворюємо його у текстовий вид функцією Format та записуємо результат у змінну m_edit. Виклик функції UpdateData призводить до оновлення значення текстового поля. Функція SetTimer створює новий таймер, який потрібен для періодичного виклику функції OnTimer.

У вікні діалогу є кнопка IDC_BUTTON1 для зупинки автоматичної зміни напруги. Створимо для цієї кнопки функцію відгуку OnButton1:

void Dia::OnButton1()

{

m_edit = "0";

UpdateData(false);

KillTimer(1);

}

Спочатку у m_edit записуємо число 0, потім оновлюємо текстові поля через виклик функції UpdateData. На випадок якщо у вікна існує таймер відключаємо його функцією KillTimer.

При натисненні на прапорець IDC_CHECK1 (з написом "Сброс напряжения") викликається функція OnCheck1:

void Dia::OnCheck1()

{

m_edit = "0";

UpdateData(false);

KillTimer(1);

m_slid.SetPos(0);

SendMessage(WM_HSCROLL);

}

Спочатку виконуються ті самі дії що і в функції OnButton1. А далі обнуляється позиція лінійного регулятора через вказівку m_slid. Як зазначалось вище функцію SendMessage викликаємо для синхронізації зміни лінійного регулятора із іншими елементами керування розташованими у вікні діалогу.

Виклик вікна діалогу зробимо у класі документа CDialDoc в функції OnDialog:

void CDialDoc::OnDialog()

{

Dia dial;

dial.doc = this;

if (dial.DoModal() == IDOK)

{

vol.volt = atoi((dial.m_edit_zn.Mid(0,4)).GetBuffer(1));

vol.skor = atoi(dial.m_edit);

SetModifiedFlag();

}

}

Після вдалого виклику вікна діалогу і натиснення кнопки OK ми записуємо нові значення напруги та швидкості її зміни у об’єкт структури vol. Викликаємо функцію SetModifiedFlag для фіксації факту зміни даних класу CDialDoc. Запис та зчитування параметрів об’єкту структури vol робиться у функції Serialize. Детально серіалізація даних розглядалась у п. 7.4, тому наводити код функції Serialize не будемо.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]