Шаг 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; 
	} 
}

Напишите эту функцию. Добавьте в ресурсы диалог:

64.gif (1112 b)

Измените реакцию на 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)); 

Этот дискриптор используется часто и лучше его иметь при себе.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.