| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

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

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


Предыдущий Шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz