Обробка повідомлень від елементів управління

У вікно діалогу ми ввели чотири кнопки, при натисненні яких в клас діалогового вікна посилається повідомляюче повідомлення BN_CLICKED. При зміні даних у вікнах редагування посилаються інші повідомлення EN_CHANGE. При дії на повзунки також посилаються повідомляючі повідомлення, які ми розглядали в попередній главі. Проте, як було відмічено, повзунки посилають і звичайні повідомлення (WM_HSCROLL або WM_VSCROLL). Якщо у вікні діалогу є більш за один повзунок, то повідомлення від них зручно обробити в одній функції, яка викликається у відповідь на повідомлення про прокрутку. Введіть в клас CPolyDlg реакцію на WM_HSCROLL, оскільки наші повзунки орієнтовані горизонтально:

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

{

//====== Нецікаве для нас повідомлення

if (nSBCode==SB_ENDSCROLL)

return;

//====== Встановлюємо прапор повідомлень від повзунків

m_bScroll = true;

//====== Взнаємо ідентифікатор активного повзунка

switch(GetFocus()->GetDlgCtrlID())

{

case IDC_RSLIDER:

//====== Прочитуємо поточну позицію движка

m_nRed = m_rSlider.GetPos();

//====== Синхронізуємо поле, редагування

SetDlgltemlnt(IDC_RED, m_nRed);

break;

case IDC_GSLIDER:

m_nGreen = m_gSlider.GetPos();

SetDlgltemlnt(IDC_GREEN, m_nGreen);

break; case IDC_BSLIDER:

m_nBlue = m_bSlider.GetPos() ;

SetDlgltemlnt(IDC_BLUE, m_nBlue);

break;

}

//====== Знімаємо прапор повідомлень від повзунків

m_bScroll = false;

}

Повідомлення від всіх повзунків обробляються в одній функції. Ідентифікатор активного повзунка визначається шляхом послідовного виклику двох функцій GetFocus і GetDlgctrliD, що є методами класу cwnd.

Прапор повідомлень від повзунків (m_bScroll) знадобився нам для того, щоб при синхронізації елементів управління не відбувалися повторні виклики функцій-обробників. Річ у тому, що при зміні позиції повзунка ми повинні привести у відповідність вікно редагування, а при ручній зміні числа у вікні редагування ми повинні синхронізувати позицію повзунка. Але повідомлення EN_CHANGE посилається як при ручній зміні, так і при програмній зміні за допомогою функції SetDlgltemlnt. Прослідимо ланцюг таких подій: користувач посунув движок повзунка, ми викликаємо SetDlgltemlnt, вона провокує посилку повідомлення EN_CHANGE, а обробник цього повідомлення коректує положення повзунка, яке і без того вірно.

Введіть в клас діалогу реакції на повідомлення EN_CHANGE від чотирьох елементів IDC_PEN, IDC_RED, IDC_GREEN І IDC_BLUE. Ви пам'ятаєте, що це треба робити за допомогою кнопки Events у вікні Properties. Вставте коди в остови функцій обробки, як показано нижче:

void CPolyDlg::OnChangePen(void)

{

BOOL bSuccess; //====== Спроба перетворити в число

UINT nSize = GetDlgltemlnt(IDC_PEN, SbSuccess, FALSE);

if (bSuccess && nSize < 101)

{

m_nPen = nSize;

m_pDoc->m_Poly-m_nPenWidth = m_nPen;

m_pDoc->UpdateDrawView();

}

}

Відзначте, що тут ми навмисно не користуємося функцією UpdateData, яка провокує обмін даними відразу зі всіма полями вікна діалогу, оскільки хочемо показати економніший спосіб вибіркового (цільового) обміну за допомогою функції GetDlgltemlnt. Правда, при такому підході не працюють функції перевірки даних типа DDV_ і доводиться виробляти перевірку самостійно:

void CPolyDlg::OnChangeRed(void) {

//====== Якщо повідомлення спровоковане повзунком

//====== то обходимо коди його синхронізації

if (!m_bScroll)

{

m_nRed = GetDlgltemlnt(IDC_RED, 0, FALSE);

m_rSlider.SetPos(m_nRed);

//====== Змінюємо колір фону вікна редагування

m_cRed.ChangeColor(RGB(m_nRed, 0, 0));

//====== Коректуємо інтегральний колір

UpdateColor();

}

void CPolyDlg::OnChangeGreen(void)

{

if (!m_bScroll)

{

m_nGreen = GetDlgltemlnt(IDC_GREEN, 0, FALSE), m gSlider.SetPos(m_nGreen);

m_cGreen.ChangeColor(RGB(0, m_nGreen, 0)); UpdateColor ();

}

void CPolyDlg::OnChangeBlue(void)

{

if (!m_bScroll)

{

m_nBlue = GetDlglteralnt(IDC_BLUE, 0, FALSE);

m_bSlider.SetPos(m_nBlue);

}

m_cBlue.ChangeColor(RGB(0, 0, m_nBlue));

UpdateColor ();

}

Введіть тіло допоміжної функції, яка обчислює інтегральний колір і вносить зміни, перефарбовувавши вікно діалогу IDC_COLOR, і за допомогою документа поточний полігон у вікні CDrawView:

void CPolyDlg::UpdateColor()

{

COLORREF clr = RGB (m_riRed,m_nGreen,m_nBlue) ;

m_cColor.ChangeColor(clr) ;

m_pDoc->m_Poly.m_BrushColor = clr;

m_pDoc->UpdateDrawView();

}

За допомогою Studio.Net введіть в клас діалогу реакції на повідомляючі повідомлення (BN_CLICKED) про натиснення кнопок вибору стандартної геометрії для полігонів (IDCJTRI, IDC_PENT і IDC_STAR). У них ми за допомогою техніки зворотного покажчика знов звертаємося до документа і використовуємо його дані і методи для заміни координат точок поточного полігону:

void CPolyDlg::OnClickedTri(void)

{

m_pDoc->m_Poly.MakeTria() ;

m_pDoc->UpdateDrawView() ;

}

void CPolyDlg::OnClickedPent(void)

{

m_pDoc->m_Poly.MakePent() ;

m_pDoc->UpdateDrawView() ;

}

void CPolyDlg::OnClickedStar(void)

{

m_pDoc->m_Poly.MakeStar() ;

m_pDoc->UpdateDrawView();

}

Зміните тіло конструктора діалогового класу, з тим аби при відкритті діалогу він зміг запам'ятати зворотний покажчик (адреса документа) і всі його елементи правильно ініціалізували:

CPolyDlg::CPolyDlg(CTreeDoc* p)

: CDialog (CPolyDlg::IDD, 0)

{

m_pDoc = p;

m_nPen = p->m_Poly.m_nPenWidth;

//====== Розщеплюємо колір фону поточного полігону

COLORREF brush = p->m_Poly.m_BrushColor;

m_nRed = GetRValue(brush); // на три компоненти

m_nGreen = GetGValue(brush);

m_nBlue = GetBValue(brush);

m_bScroll = false; // Повзунки у спокої

 

рекламодавці:

/ LF KS

::  Меню ::

Введення

Початок роботи з Visual Studio.Net

Режими відображення координат

Традиційне Windows-приложение

Аналізатор код помилок

Управління файловим деревом

Графіка OPENGL

Тривимірні графіки функцій

Від сирих COM API до проекту ATL

Тривимірна графіка в проекті ATL

З життя студентів

Вирішуємо краєву задачу

Деякі відомості про архітектуру Windows


:: Реклама ::

Створи сайт за допомогою MS Office AsenKat - каталог сайт

:: Статистика ::

Індекс цитування

:: Навигация ::

Головна
Додати у вишукане  

 

 

 


Copyright © Asentli, 2008