Диалог как главное окно приложения

Опубликовано 2 февраля, 2010 в разделе WinAPI. Разместил Алексей(admin).

Диалоговое окно на WinAPI

Сегодня я хотел бы привести пример создания модального диалога, как главного окна приложения, на WinAPI.

Конечно описывать всё нет смысла(это можно прочитать в книгах по WinAPI), но всё же основные принципы и код выложу.

Итак, для создания диалогового окна и работе с ним нужно выполнить следующую последовательность действий:
1. Определение шаблона диалогового окна.
2. Определение диалоговой процедуры.
3. Вызов функции создания диалогового окна.
4. Обмен данными между диалоговой процедурой и вызывающей функцией окна.

Определяем шаблон, в файле ресурсов. Добавим кнопку и Static Text, который заполним при инициализации диалога.

//res.rc
#include <windows.h>
#include <windowsx.h>
#include "main.h"
 
DIALOGS DIALOGEX 100, 100, 236, 46
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Заголовок"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
LTEXT           "", IDC_STATIC,6,6,218,8
PUSHBUTTON      "Закрыть",IDCANCEL,180,26,50,14
END

Далее создадим файл, содержащий:
- Главную функцию программы, которая и вызовет функцию создания диалога.
- Оконную процедуру диалогового окна.
- Функцию обработки сообщений об инициализации диалога.
- Функцию обработки сообщений от элементов управления.

//main.cpp:
#include <windows.h>
#include <windowsx.h>
#include "main.h"
 
/*Главная функция WinMain*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
	DialogBox(hInst, "Dialogs", NULL, DlgProc); //Создание диалогового окна
	return 0;
}
 
/*Оконная процедура диалогового окна*/
BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		HANDLE_MSG(hwnd, WM_INITDIALOG, DlgOnInitDialog);
		HANDLE_MSG(hwnd, WM_COMMAND, DlgOnCommand);
	default:
		return FALSE;
	}
}
 
/*Функция обработки сообщений об инициализации диалога*/
BOOL DlgOnInitDialog(HWND hwnd, HWND, LPARAM)
{
	SetWindowText(GetDlgItem(hwnd, IDC_STATIC), "Инициализация диалога");
	return TRUE;
}
 
/*Функция обработки сообщений от элементов управления*/
void DlgOnCommand(HWND hwnd, int id, HWND, UINT)
{
	switch(id)
	{
	case IDCANCEL:
		EndDialog(hwnd,0);
	}
}

Кстати, нам нужно определить константу IDC_STATIC для текста.

//main.h
#define IDC_STATIC 100
 
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
void DlgOnCommand(HWND, int, HWND, UINT);
BOOL DlgOnInitDialog(HWND, HWND, LPARAM);

Возможно вам покажется интересным макрос HANDLE_MSG, про него подробно написано в книжке Win32. Основы программирования(К.Г. Финогенов). Да и вообще в этой книжке можно более подробно почитать про создания диалоговых окон, да и не только.

Исходный код:  Диалоговое окно на WinAPI (1.3 Кб, 1,070 скачиваний)

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Что можно ещё почитать:

Оставьте комментарий

You must be logged in to post a comment.