Иллюстрированный самоучитель по Visual Studio.Net


Обработка сообщений от элементов управления - часть 2


Но сообщение 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);

}




Начало  Назад  Вперед