Шаг 64 - Функция диалогового окна.
Как у окна есть функция обработки, так и у диалогового окна есть своя функция обработки команд, таких как нажатие на кнопку или перемещение диалогового окна. Отличаются они тем, что функция диалогового окна не вызывает 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));
Этот дискриптор используется часто и лучше его иметь при себе.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|