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

Немодальный диалог

Мы изменили конструктор класса CPolyDlg так, чтобы он имел один параметр – адрес документа, который мы используем в качестве обратного указателя. Это поможет нам управлять приложением, оставаясь в рамках методов диалогового класса. Теперь воспользуемся услугами Studio .NET для создания функции-обработчика сообщения =WM_CTLCOLOR в классе нестандартного окна редактирования.

  1. Поставьте фокус на элемент CClrEdit дерева классов в окне Class View, перейдите в окно Properties и нажмите кнопку Messages.
  2. Нажмите кнопку Categorized и, нажав на маркер (-) Common, закройте список обычных сообщений.
  3. В оставшейся части списка Reflected найдите сообщение =WM_CTLCOLOR и создайте функцию для его обработки, выбрав <Add> в ячейке справа.

Найдите заготовку тела функции ctlColor в файле PolyDlg.cpp и вставьте в нее следующие коды:

HBRUSH CClrEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC › SetTextColor (m_clrText); // Цвет текста
pDC › SetBkColor (m_clrBk); // Цвет подложки текста
return m_brBk; // Возвращаем кисть
}

Создайте тело вспомогательной функции ChangeColor, которую мы будем вызывать в те моменты существования диалога, когда пользователь изменяет значения элементов управления цветом:

void CClrEdit::ChangeColor(COLORREF clr)
{
//====== Цвет текста – инвертирований цвет фона
m_clrText = ~clr & Oxffffff;
m_clrBk = clr;
//====== Создаем кисть цвета фона
m_brBk.DeleteObject();
m_brBk.CreateSolidBrush (clr);
Invalidate ();
}

Главным управляемым параметром является кисть (m_brBk), которую в ответ на отраженное сообщение =WM_CTLCOLOR надо возвратить каркасу приложения. Попутно мы изменяем цвет текста (setTextColor) и его подложки (setBkColor). Чтобы понять, что такое подложка текста, при отладке временно закомментируйте строку:

pDC › SetBkColor (m_clrBk);

При изменении (инвертировании) цвета текста мы вынуждены обнулять четвертый байт переменной m_clrText. В более старых версиях Windows это действие было лишним. Теперь четвертый байт используется для задания степени прозрачности при воспроизведении растровых изображений. Если он не равен нулю, то инвертирование цвета не проходит. Первые три байта, как вы помните, задают три компонента (red, green, blue).

Изменение цвета пользователем с помощью элементов управления будет мгновенно отслеживаться в четырех полях диалога (три компонента цвета и суммарный цвет в окне Color). Так как мы хотим отследить изменение цвета и в окне представления, управляемого классом CDrawView, то мы добываем адрес родительского окна (GetParent) и вызываем вспомогательную функцию UpdateDrawView.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.