C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 64 - Функция диалогового окна / Win 32 API / Win32 API

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

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


| |
Автор Каев Артем.
[AD]