Диалоговые окна

Листинг 7.3

#include <windows.h> #include "resource.h"

HWND DlgWin - 0; //Дескриптор диалогового окна в немодальном режиме BOOL DialogMinCHWND hDlg. UINT message, WPARAM wParam. LPARAM lParam) {

switch(message) {

case WM_INITDIALOG: //По этому сообщению изменяется заголовок диалога SetWindowTextChDlg."Простейший диалог"); //При появлении окна выводится текст в поле заголовка SetWi ndowText(GetDlg11em(hDlg.IDOK)."Выход"); //Изменить надпись на кнопке ID0K //SetFocus(GetDlgltem(hDlg.IDCANCEL)): //Передача фокуса кнопке IDCANCEL return TRUE;

case WM_COMMAND: //Обработка сообщений от управляющих элементов. //В 1Рагат в этот момент находится дескриптор окна элемента, //в LOWORD(wParam) - идентификатор этого элемента, //а в HIWORD(wParam) - код извещения. //Чтобы закрыть диалог, надо вызвать функцию EndDialogO. if (LOWORD(wParam) - IDOK)

{EndDialogChDlg. 0); return TRUE;} //По второй кнопке не выполняем никаких действий: if (LOWORD(wParam) - ID2) return TRUE; break;

case WM_CL0SE:
{EndDialogChDlg. 1);.
return TRUE;
}
}
return FALSE; }

Если в последней строке использовать оператор return TRUE, то обработка сообщений по умолчанию будет выполняться, но программист сообщает обрабатывающей функции, что он уже сделал все необходимое самостоятельно. В результате возврата TRUE не обработается по умолчанию сообщение WMERASEBKGND. В результате не будет отрисован фон окна диалога, и пользователь увидит только графические элементы управления.

Теперь нужно добавить в основную функцию приложения обработку сообщения WM_ENTERIDLE. Диалоговое окно не формирует его явно, и сообщение посылается при обработке по умолчанию. Легко убедиться в том, что сообщение приходит от диалогового окна всегда, то есть диалоговая процедура возвращает управление не в операционную систему, а в обработчик по умолчанию.

Следует удалить комментарии в следующей строке при обработке сообщения WMJNITDIAL0G:

//SetFocus(GetDlgItem(hDlg.IDCANCEL)):

Чтобы при открытии диалога фокус ввода был действительно передан кнопке IDCANCEL, необходимо завершить обработку оператором return FALSE, то есть и в ветви case WM_INITDIAL0G объем дополнительной обработки увеличивается при возврате FALSE.


⇐ Предыдущая| |Следующая ⇒