- •Глава 11 Окна диалога
- •Модальные окна диалога
- •Создание окна диалога About
- •Шаблон окна диалога
- •Диалоговая процедура
- •Вызов окна диалога
- •Дополнительная информация о стиле окна диалога
- •Дополнительная информация об определении дочерних окон элементов управления
- •Более сложное окно диалога
- •Работа с дочерними элементами управления окна диалога
- •Кнопки ok и Cancel
- •Позиции табуляции и группы
- •Рисование в окне диалога
- •Использование с окном диалога других функций
- •Определение собственных окон управления
- •Окна сообщений
- •Информация во всплывающих окнах
- •Немодальные окна диалога
- •Различия между модальными и немодальными окнами диалога
- •Новая программа colors
- •Программа hexcalc: обычное окно или окно диалога?
- •Творческое использование идентификаторов дочерних окон элементов управления
- •Диалоговые окна общего пользования
- •Модернизированная программа poppad
- •Изменение шрифта
- •Поиск и замена
- •Программа для Windows, содержащая всего один вызов функции
Кнопки ok и Cancel
В программе ABOUT2 имеется две кнопки, помеченные как OK и Cancel. В шаблоне окна диалога файла описания ресурсов ABOUT2.RC кнопка OK имеет идентификатор IDOK (определенный в заголовочных файлах Windows как 1), а кнопка Cancel имеет идентификатор IDCANCEL (определенный как 2). При этом кнопкой по умолчанию является кнопка OK:
DEFPUSHBUTTON "OK" IDOK, 20, 168, 40, 14, WS_GROUP
PUSHBUTTON "Cancel"IDCANCEL, 80, 168, 40, 14, WS_GROUP
Такое соглашение для кнопок OK и Cancel в окнах диалога вполне обычно; наличие выбираемой по умолчанию кнопки OK помогает работе с интерфейсом клавиатуры. И вот почему: обычно окно диалога закрывается с помощью либо щелчка мыши на одной из этих кнопок, либо нажатия клавиши <Spacebar>, когда нужная кнопка имеет фокус ввода. Кроме этого оконная процедура окна диалога генерирует сообщение WM_COMMAND при нажатии клавиши <Enter>, независимо от того, какое из окон элементов управления имеет фокус ввода. Младшее слово параметра wParam соответствует значению идентификатора выбираемой по умолчанию кнопки окна диалога до тех пор, пока другая кнопка не получит фокус ввода. В этом случае младшее слово параметра wParam получает значение идентификатора той кнопки, которая имеет фокус ввода. Если в диалоговом окне нет кнопки, выбираемой по умолчанию, то Windows посылает диалоговой процедуре сообщение WM_COMMAND с младшим словом параметра wParam равным IDOK. А при нажатии клавиши <Esc> или <Ctrl>+<Break>, Windows посылает процедуре окна диалога сообщение WM_COMMAND с младшим словом параметра wParam равным IDCANCEL. Таким образом нет необходимости добавлять в процедуру окна диалога отдельную логику работы с клавиатурой, поскольку те нажатия клавиш, которые обычно приводят к закрытию окна диалога, преобразуются Windows в сообщения WM_COMMAND для этих двух кнопок.
Функция AboutDlgProc, вызывая функцию EndDialog, обрабатывает эти два сообщения WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK :
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
EndDialog (hDlg, TRUE) ;
return TRUE ;
case IDCANCEL :
EndDialog (hDlg, FALSE) ;
return TRUE ;
Когда оконная процедура программы ABOUT2 рисует в рабочей области своей программы прямоугольник или эллипс, она использует глобальные переменные iCurrentColor и iCurrentFigure. Для рисования фигуры в окне диалога в функции AboutDlgProc используются локальные статические переменные iColor и iFigure.
Обратите внимание на отличие второго параметра у двух функций EndDialog. Это значение передается обратно в WndProc в качестве возвращаемого значения функции DialogBox:
case IDM_ABOUT :
if (DialogBox (hInstance, "AboutBox", hwnd, AboutDlgProc))
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
Если функция DialogBox возвращает TRUE (т. е. ненулевое значение), что означает нажатие кнопки OK, то WndProc должна обновить рабочую область, нарисовав новую фигуру новым цветом. Эти фигура и цвет запоминаются в глобальных переменных iCurrentColor и iCurrentFigure в функции AboutDlgProc, когда она получает сообщение WM_COMMAND с младшим словом параметра wParam равным IDOK. Если функция DialogBox возвращает FALSE, то родительское окно продолжает использовать прежние значения глобальных переменных iCurrentColor и iCurrentFigure.
Величины TRUE и FALSE, как правило, используются в функции EndDialog для того, чтобы просигнализировать оконной процедуре родительского окна о том, какой из кнопок (OK или Cancel) пользователь закрывает окно диалога. Однако параметром функции EndDialog фактически является int, поэтому таким образом можно передавать гораздо больше информации, чем просто значения TRUE или FALSE.
