
- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Рисование в окне диалога
Помимо всего прочего, программа ABOUT2 делает и кое-что необычное: рисует в окне диалога. Давайте разберемся как. Внутри шаблона окна диалога в файле ABOUT2.RC определяется пустое текстовое окно управления с размерами и положением, определяющими область, в которой предполагается рисование:
CTEXT "" IDD_PAINT, 68, 54, 60, 60
Ширина этой области равна 15 символов, а высота 7,5 символов. Поскольку в этом окне управления текста нет, все, что делает оконная процедура класса "static" состоит в обновлении фона при перерисовке дочернего окна управления.
Когда текущий цвет или фигура изменяется, или когда окно диалога получает сообщение WM_PAINT, процедура диалога вызывает функцию PaintTheBlock, вызов которой в программе ABOUT2.С выглядит так:
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
Описатель окна hCtrlBlock, являющийся первым параметром функции, был получен при обработке сообщения WM_INITDIALOG:
hCtrlBlock = GetDlgItem (hDlg, IDD_PAINT) ;
Далее представлено тело функции PaintTheBlock:
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}
Таким образом, функция делает недействительным дочернее окно управления, помечает его как обновленное, а затем вызывает другую функцию программы ABOUT2 с именем PaintWindow.
Функция PaintWindow получает описатель контекста устройства окна hCtrl и рисует выбранную фигуру, закрашивая ее кистью выбранным пользователем цветом. Размер дочернего окна управления получен с помощью функции GetClientRect. Хотя в шаблоне окна диалога размер дочернего окна управления определяется в символах, GetClientRect возвращает размеры в пикселях. Кроме нее, можно использовать функцию MapDialogRect, которая преобразует символьные координаты окна диалога в пиксельные координаты рабочей области.
Фактически, мы рисуем не в рабочей области окна диалога, а в рабочей области дочернего окна элемента управления. Когда бы окно диалога ни получило сообщение WM_PAINT, дочернее окно управления является недействительным, затем обновляется и его рабочая область становится действительной, что позволяет рисовать в нем.
Использование с окном диалога других функций
Большинство функций, которые используются с дочерними окнами, также можно применять и с дочерними окнами элементов управления в окне диалога. Например, используя функцию MoveWindow, можно двигать окно управления по окну диалога и заставлять пользователя гоняться за ним с мышью.
Иногда возникает необходимость в зависимости от установок других окон управления, в динамическом режиме делать доступными или недоступными определенные элементы управления в окне диалога. Вызов следующей функции:
EnableWindow (hwndCtrl, bEnable) ;
делает окно элемента управления доступным, когда параметр bEnable равен TRUE (ненулевое значение) и недоступным, когда bEnable равен FALSE (0). Если окно элемента управления недоступно, то оно не реагирует ни на клавиатуру, ни на мышь. Нельзя делать недоступным окно элемента управления, имеющее фокус ввода.