Win32编程之对话框(五)
一、对话框原理
(1).对话框的分类
- 模式对话框:当对话框显示时,会禁止其他窗口和用户交互操作
- 无模式对话框:在对话框显示后,其他窗口仍然可以和用户交互操作
(2).对话框基本使用
- 对话框窗口处理函数
- 注册窗口类(不使用)
- 创建对话框
- 对话框的关闭
对话框窗口处理函数(并非真正的对话框窗口处理函数)
1 2 3 4 5 6 7 8 9 | INT CALLBACK DialogProc( HWND hwndDlg, //窗口句柄 UINT uMsg, //窗口句柄 WPARAM wParam, //消息参数 LPARAM lParam //消息参数 ); 返回TRUE:缺省处理函数不需要处理 返回FALSE:交给缺省处理函数处理 不需要调用缺省对话框窗口处理函数 |
二、模式对话框
(1).创建对话框
1 2 3 4 5 6 7 8 | INT DialogBox( HINSTANCE hInstance, //应用程序实例句柄 LPCTSTR lpTemplate, //对话框资源ID HWND hWndParent, //对话框父窗口 DLGPROC lpDialogFunc //自定义函数 ); DialogBox是一个阻塞函数,只有当对话框关闭后,才会继续,继续执行 后续代码。返回值是通过EndDialog设置 |
(2).对话框的关闭
1 2 3 4 5 6 | BOOL EndDialog( HWND hDlg, //关闭的对话框窗口句柄 INT_PTR nResult //关闭的返回值 ); 关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow函数 nResult是DialogBox函数退出的返回值 |
(3).对话框的消息
WM_INITDIALOG:对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | INT CALLBACK DlgProc( HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) { switch (msgID) { case WM_INITDIALOG: { MessageBox(hwndlg, TEXT( "WM_INITDIALOG" ), TEXT( "提示" ), MB_OK); break ; } case WM_SYSCOMMAND: { if (wParam == SC_CLOSE) { //销毁模式对话框 EndDialog(hwndlg, 100); } break ; } default : break ; } //将消息交给真正的对话框窗口处理函数的后续代码帮我们处理 return FALSE; } void OnCommand( HWND hWnd, WPARAM wParam) { switch (LOWORD(wParam)) { case ID_MODEL: { int nRet = DialogBox(g_hIns, ( LPCTSTR )IDD_DIALOG1, hWnd, DlgProc); if (nRet == 100) { MessageBox(hWnd, TEXT( "successfuly" ), TEXT( "提示" ), MB_OK); } break ; } default : break ; } } //窗口处理函数(自定义,处理消息) LRESULT CALLBACK WindProc( HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) { switch (msgID) { case WM_COMMAND: { OnCommand(hWnd, wParam); break ; } default : break ; } return DefWindowProc(hWnd, msgID, wParam, lParam); } |
三、无模式对话框
(1).创建对话框
1 2 3 4 5 6 7 | HWND CreateDialog( HINSTANCE hInstance, //应用程序实例句柄 LPCTSTR lpTemplate, //模板资源ID HWND hWndParent, //父窗口 DLGPROC lpDialogFunc //自定义函数 ); 非阻塞函数,创建成功后返回窗口句柄,需要使用ShowWindow函数显示对话框 |
(2).对话框的关闭
关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | INT CALLBACK DlgProc( HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) { switch (msgID) { case WM_INITDIALOG: { MessageBox(hwndlg, TEXT( "WM_INITDIALOG" ), TEXT( "提示" ), MB_OK); break ; } case WM_SYSCOMMAND: { if (wParam == SC_CLOSE) { //销毁非模式对话框 DestroyWindow(hwndlg); } break ; } default : break ; } //将消息交给真正的对话框窗口处理函数的后续代码帮我们处理 return FALSE; } void OnCommand( HWND hWnd, WPARAM wParam) { switch (LOWORD(wParam)) { case ID_MODEL: { HWND hDialog = CreateDialog(g_hIns, ( LPCTSTR )IDD_DIALOG1, hWnd, DlgProc); ShowWindow(hDialog, SW_SHOW); break ; } default : break ; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?