Сегодня я хотел бы привести пример создания модального диалога, как главного окна приложения, на WinAPI.
Конечно описывать всё нет смысла(это можно прочитать в книгах по WinAPI), но всё же основные принципы и код выложу.
Итак, для создания диалогового окна и работе с ним нужно выполнить следующую последовательность действий: 1. Определение шаблона диалогового окна. 2. Определение диалоговой процедуры. 3. Вызов функции создания диалогового окна.
4. Обмен данными между диалоговой процедурой и вызывающей функцией окна.
Определяем шаблон, в файле ресурсов. Добавим кнопку и Static Text, который заполним при инициализации диалога.
//res.rc #include #include #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 #include #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 Кб, 934 скачиваний)