Главная функция приложения, содержащего немодальный диалог с назначенной по умолчанию кнопкой, реализована в файле Main.cpp. С учетом данного замечания она будет выглядеть так, как показано в листинге 7.6.
Листинг 7.6
#include <windows.h> extern HWND DlgWin: extern HWND DlgMod:
//Функция инициализации совпадает с проектом minim, поэтому здесь //указывается только ее прототип int InitApp(HINSTANCE KodPril); HWND hWnd: MSG msg:
int API ENTRY WinMain (HINSTANCE KodPril.HINSTANCE.LPSTR.int) {
if (InitAppCKodPri1)) return 1; while (GetMessage(&msg. NULL. 0. 0) ) {
//Если в очереди приложения есть сообщения для диалоговых окон, то //отображается MessageBoxO - это средство задержать вызов диалоговой //процедуры до закрытия диалога Немодальный диалог
if(msg.hwnd--DlgWin || msg.hwnd-DlgMod )
i f (msg .message-WMJRBUTTONDOWN)
MessageBox(NULL,"Щелчок в окне диалога"."Приложение".NULL):
i f(!IsDi а1ogMessage(DlgWi n. &msg)) //Если функция IsDialogMessageO возвращает ненулевое значение, значит, она //организовала вызов диалоговой процедуры DlgWin.
DispatchMessageC (LPMSG) &msg ); //Вызов DispatchMessageC) при этом нужно пропустить, иначе диалоговое окно //DlgWin будет получать все сообщения дважды }
return 0; }
Обратите внимание на то, что обычные сообщения функция Di spatchMessage() передает диалоговому окну не хуже, чем IsDi al ogMessage(), и, только когда приходят сообщения от клавиатуры Di spatchMessage(), обрабатывает их некорректно. Поскольку фокус ввода принадлежит не диалогу, а его дочернему окну (кнопке ID0K), в этих сообщениях msg.hwnd содержит дескриптор кнопки и DispatchMessageC) не вызывает диалоговую процедуру.
Корректную обработку нажатия клавиши Enter можно организовать и без использования функции IsDi al ogMessage(). Для этого следует использовать дескриптор окна ID0K, который был сохранен в переменной HWND ButtonWnd. Также потребуется подменять нажатия и отпускания клавиши Enter, поступающие в окно кнопки, сообщениями WM_LBUTT0ND0WN и WM_LBUTTONUP, как показано в листинге 7.7.