Окт 16

Пример использования немодального окна диалога

В приложении ModelessDlg, которое мы сейчас разработаем, используется немодальное диалоговое окно, содержащее три полосы прокрутки. При помощи этих полос пользователь может изменять цвет фона в клиентской области основного окна.
Создайте новый проект типа Win32 Application с именем ModelessDlg. Скопируйте в папку проекта файлы KWndPlut.h, KWndPlut.cpp из папки проекта MyNotebook2, после чего добавьте их в состав нового проекта.
Включите в приложение ресурс диалогового окна с идентификатором IDD_ MODELESS и заголовком Цвет фона. На вкладке Styles окна Dialog Properties нужно выбрать стиль окна Child, а на вкладке More Styles установить флажок Visible. Остальные свойства окна оставьте со значениями по умолчанию.
Удалите с заготовки диалогового окна кнопки ОК и Cancel.
Поместите на форму диалога надписи Red, Green и Blue, а под ними — элементы управления типа Vertical Scroll Bar .
Для полос прокрутки задайте, соответственно, идентификаторы IDC_RED, IDC_GREEN, IDC_BLUE. В окне свойств каждой полосы прокрутки должны быть установлены флажки Visible и Tab stop.
Диалоговая процедура ModelessDLgProc осуществляет обработку сообщений от полос прокрутки IDC_RED, IDC_GREEN и IDC_BLUE. Элементы управления типа Vertical Scroll Bar посылают родительскому окну такие же сообщения, как и вертикальная полоса прокрутки главного окна приложения. Пример обработки этих сообщений мы уже рассматривали в приложении TextViewer (см. листинг 2.2).
В результате обработки сообщений от полос прокрутки изменяются значения глобального массива rgb, в котором хранятся текущие величины для RGB-компонентов цвета. Если изменилось хотя бы одно из значений, то диалоговая процедура при помощи функции SendMessage посылает пользовательское сообщение UM_CHANGE, адресуя его оконной процедуре родительского окна. Константа UM_CHANGE является значением перечисляемого типа UserMsg, который определен оператором enum.
Оконная процедура WndProc содержит код обработки сообщения UM_CHANGE. В этом блоке вызывается функция SetClassLong для изменения цвета фона главного окна приложения. Чтобы окно перерисовалось, нужно также вызвать функцию InvalidateRect. Обратите внимание на то, что если в качестве второго аргумента функции InvalidateRect передать NULL, то при перерисовке возникнет неприятное мерцание фона диалогового окна.
Уничтожение диалогового окна происходит в блоке обработки сообщения WM_DESTROY.