使用DialogBox创建Windows程序

本文介绍如何利用DialogBox函数简化Windows程序中界面布局的创建过程。通过资源文件定义窗口和菜单,结合SHCreateMenuBar设置菜单标志,实现窗口布局及消息处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用DialogBox创建Windows程序

一般的使用SDK编写的WIN32程序(使用WinMain和WindProc进行消息处理),
生成的EXE文件都比较小,但是也会存在不足,即创建的窗口,界面的控件布局比较麻烦。
为此可以使用资源的方法解决窗口布局麻烦的问题,即在资源文件里面建好窗口和菜单,
然后再调用DiaglogBox函数创建Windows窗口,再在DLGPROC里面处理Window消息。

函数声明如下:
int DialogBox(
HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
HINSTANCE hInstance:为资源句柄
LPCTSTR lpTemplate:指向需要创建的窗口模板的长指针,可用MAKEINTRESOURCE来通过窗口ID获取
HWND hWndParent:父窗口句柄
DLGPROC lpDialogFunc:窗口的消息处理函数

窗口消息处理的回调函数定义如下:
BOOL CALLBACK DialogProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
这里,如果返回为TRUE则表示消息已经处理完了,如果是FALSE,表示还没处理好,系统会根据消息类型,
进行默认的处理。

调用DialogBox的时候,会创建资源里面的窗口,创建完后即进入所创建窗口的消息循环函数里面,
直到调用EndDialog()函数返回的时候,才会返回DialogBox函数。

注意,当使用SHCreateMenuBar的时候,如果创建的菜单是资源文件里面的,必须设置SHMENUBARINFO中
的dwFlags为SHCMBF_HMENU!

#include <windows.h> #include <aygshell.h> #include "resource.h" ////////////////////////////////////////////////////////////////////////// #pragma comment(lib, "aygshell.lib") ////////////////////////////////////////////////////////////////////////// HWND g_hWnd; HINSTANCE g_hInst; ////////////////////////////////////////////////////////////////////////// BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL InitWindow(const HWND hDlg, UINT nToolBarId); ////////////////////////////////////////////////////////////////////////// #define WND_TITLE _T("ResDialog") ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) { int nResult; HANDLE hMutex; hMutex = CreateEvent(NULL, FALSE, FALSE, _T("_PROGRAM_ONLY_ONE_INSTANCE_")); if (hMutex != NULL) { if (GetLastError() == ERROR_ALREADY_EXISTS) { HWND hWnd; hWnd = FindWindow(NULL, WND_TITLE); if (hWnd != NULL) { SetForegroundWindow((HWND)((ULONG)hWnd | 0x00000001)); } } else { g_hInst = hInstance; nResult = DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc); nResult = GetLastError(); } CloseHandle(hMutex); } return (nResult>=0); } ////////////////////////////////////////////////////////////////////////// BOOL CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL fReturn = TRUE; switch(uMsg) { case WM_INITDIALOG: if (!InitWindow(hDlg, IDR_MENU1)) EndDialog(hDlg, -1); // Exit cause error break; case WM_COMMAND: switch(wParam) { case IDM_QUIT: EndDialog(hDlg, IDOK); break; } break; case WM_DESTROY: break; default: fReturn = FALSE; } return fReturn; } ////////////////////////////////////////////////////////////////////////// BOOL InitWindow(const HWND hDlg, UINT nToolBarId) { // Specify that the dialog box should stretch full screen SHINITDLGINFO shidi; ZeroMemory(&shidi, sizeof(shidi)); shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hDlg; // set up Soft Keys menu SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hDlg; mbi.dwFlags = SHCMBF_HMENU; mbi.nToolBarId = nToolBarId; mbi.hInstRes = g_hInst; // If we could not initialize the dialog box, return an error if (FALSE == (SHInitDialog(&shidi) && SHCreateMenuBar(&mbi))) { return FALSE; } // set the title bar SetWindowText(hDlg, WND_TITLE); return TRUE; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值