Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
43-70_otvety_na_teplogo.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
87.53 Кб
Скачать

69. Основные правила интерфейса клавиатуры для дочерних окон управления, описанных в диалоговом окне.

Кнопки 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:

EndDialog(hDlg, TRUE);

return TRUE;

case IDCANCEL:

EndDialog(hDlg, FALSE);

return TRUE;

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]