Как у окна есть функция обработки, так и у диалогового окна есть своя функция обработки команд, таких как нажатие на кнопку или перемещение диалогового окна. Отличаются они тем, что функция диалогового окна не вызывает DefWindowProc, а возвращает TRUE если сообщение обработано или FALSE если не обработано.
Общий вид процедуры:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { default: return FALSE; } }
Эта функция будет указываться при создании диалогового окна. Используя, например, CreateDialog() вы в параметрах указываете ссылку на эту функцию. Давайте сделаем ее к нашему предыдущему примеру.
Описание:
#include "resource.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM); BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM); int APIENTRY WinMain(HINSTANCE hInstance
И реализация пока в виде макета:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { default: return FALSE; } }
Для того, чтобы диалоговое окно закрывалось нам надо сделать реакцию на нажатие кнопок OK и CANCEL. То есть описать это в процедуре диалогового окна:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { if (wParam == IDOK||wParam == IDCANCEL) { EndDialog(hwndDlg, NULL); return TRUE; } else return FALSE; } default: return FALSE; } }
Напишите эту функцию. Добавьте в ресурсы диалог:
Измените реакцию на WM_COMMAND в функции окна программы. По выбору пункта меню About запускать диалоговое окно.
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam) { switch (Message) { case WM_COMMAND: { switch(wparam) { case ID_ABOUT: { DialogBox(hInst,MAKEINTRESOURCE (IDD_DIALOG1), hwnd, DlgProc); return 0; } } } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd,Message,wparam,lparam); }
Да, я объявил дескриптор экземпляра программы глобально:
...... BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE hInst; int APIENTRY WinMain(HINSTANCE hInstance ......
И инициализировал его:
WNDCLASS w; hInst=hInstance; memset(&w,0,sizeof(WNDCLASS));
Этот дискриптор используется часто и лучше его иметь при себе.