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

Сегодня я хотел бы привести пример создания модального диалога, как главного окна приложения, на 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 Кб, 638 скачиваний)


Бильярдист
Возможно я и путаю, но как мне кажется этот код генерится визардом студии при создании проекта подоного типа.
Алексей(admin)
Бильярдист, да, конечно. Но так же он создаёт кучу мусора и т.д. А понять и разобрать как это работает лучше создав самому.
Да и визард создаст только диалоговое окно(так называемый шаблон), а обрабатывать же придётся нам.
Визард может упростить и то и то, если использовать MFC, но для таких мелких приложений – этого не стоит.