CreateDialog和DialogBox的区别,模态对话框与非模态对话框
INT_PTR DialogBox( HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
这个函数根据对话框资源,创建一个模式对话框,这个对话框应该用EndDialog来结束。
hInstance 当前应用程序实例句柄。
lpTemplate 标识对话框模板资源,有两种使用方式:一种是把对话框模板的ID强制转为LPCTSTR,一种可以使用MAKEINTRESOURCE宏得到标识ID。
hWndParent 父窗口的句柄。
lpDialogFunc 对话框消息处理函数。
HWND CreateDialog( HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
这个函数根据对话框资源,创建一个非模式对话框,这个对话框应该用DestroyWindow来结束。
函数的参数跟上面的DialogBox用法相同。
模式对话框一般是在栈中生成的,所以EndDialog可能只是隐藏窗口,并没有销毁,当模式对话框对应的对象离开生命区时即销毁对话框。非模式的对话框一般在堆中,所以要主动用DestroyWindow销毁它。
DialogBox 函数自己处理消息循环(这个消息循环在user32.dll里面维护,看不到)且在对话框关闭后函数才会返回(返回值是EndDialog的第二个参数, 所以可以用EndDialog的第二个参数来标识子控件的ID),而CreateDialog函数调用了CreateWindowEx函数来创建窗口并立 即返回,之后这个窗口使用主窗口的消息循环(即这个窗口产生的消息可能直接发给这个窗口的处理函数,也可能进入主窗口的消息循环)。
不管是模式的还是非模式的对话框,对于不希望处理的消息,都不应该调用DefWindowProc来处理(否则会有问题),因为系统会主动对这些消 息进行处理。对于不希望处理的消息,程序要做的只是return FALSE即可,而对于处理过的消息,则应该return TRUE。
这种情况跟主窗口的处理不同。主窗口对不希望处理的消息也要调用DefWindowProc来处理,而每个消息处理分支的返回值是无关紧要的(不像对话框那样一定要返回TRUE或FALSE那样)。
非模式对话框跟主窗口使用同一个消息循环,而因为非模式对话框的消息会被系统主动调用这个对话框的处理函数来处理,所以在消息循环中不应该再对这个消息进行转换和分发,可以把消息循环改成这样:
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
// 不是非模式对话框g_hFlashWnd的消息才分发
if ( !IsDialogMessage( g_hFlashWnd, &msg ) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
CreateDialog会发出WM_INITDIALOG消息。
一些例子代码:
/// 非模式对话框消息处理函数
BOOL __stdcall FlashWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch ( msg )
{
case WM_INITDIALOG:
break;
case WM_PAINT:
break;
case WM_LBUTTONDOWN:
DestroyWindow( hWnd );
break;
default:
return FALSE; // 没处理过的消息
}
return TRUE; // 处理过的
}
///创建一个非模式对话框
g_hFlashWnd = CreateDialog( hInst, MAKEINTRESOURCE(IDD_FLASH), hWnd, (DLGPROC)FlashWndProc );
ShowWindow( g_hFlashWnd, SW_SHOW );
CreateDialog和DialogBox的区别,模态对话框与非模态对话框相关推荐
- 模态对话框和非模态对话框的区别
模态对话框和非模态对话框的区别 假设对话框类名为:CTestDlg 1,如果是模态对话框: CTestDlg ctd;//创建该对话框对像 ctd.DoModale(); 2,如果是非模态的: C ...
- 模态对话框与非模态对话框的区别
最近几天一直在研究这个问题,起初一直都是在用模态对话框,然而在一个对话框中打开另外一个模态对话框时,一直都无法将值传递给该模态对话框,今天早上将模态对话框改成了非模态对话框,问题竟然解决了.于是决定将 ...
- PyQt5 模态对话框与非模态对话框的区别
模态对话框与非模态对话框的区别 记录博文 一.模态对话框 应用程序模态对话框:一旦调用该对话框,它就会成为应用程序唯一能够与用户进行交互的部件.在关闭该对话框之前,用户都不能使用应用程序的其他部件.当 ...
- 模态对话框 和 非模态对话框的区别
模态对话框 出现模态对话框时,主窗口或其他这个程序的窗口将无法进行操作,要等到模态对话框退出才可以操作这个程序的其他窗口. (确保一对一进行反馈) 例如:每次关闭程序时都会弹出的窗口:"1. ...
- 模式对话框与非模式对话框的区别
模式对话框与非模式对话框的区别 模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持 ...
- 模式对话框与非模式对话框的区别2
模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统 ...
- Win32_SDK_非模态对话框(非模态对话框窗口的销毁,模态与非模态对比,计算器项目练习)
文章目录 1. 模态对话框与非模态对话框对比 2. 计算器项目练习模态与非模态对话框 3. 代码位置 1. 模态对话框与非模态对话框对比 模态对话框是通过DialogBox函数生成窗口,且函数的返回值 ...
- MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)
注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...
- 模态对话框和非模态对话框
模态对话框和非模态对话框 所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序下的其他窗口进行交互,直到该对话框关闭,比如记事本的另存为窗口.对于非模态对话框,当被打开时,用户既可选择和该对 ...
- c#中的模态对话框和非模态对话框
模态对话框 弹出窗口阻止调用窗口的所有消息响应. 只有在弹出窗口结束后调用窗口才能继续. 在模态窗口"关闭"后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态 ...
最新文章
- 【JavaSE_07】Java中类和对象-封装特性
- RuntimeError: get_active_profile() can only be called between a start() and a following stop()
- Feign-实现抽取
- Writing a good grant proposal
- bzoj2339: [HNOI2011]卡农
- 物联网毕业设计 超声波雷达可视化系统
- 软件开发的一些感想(五年工作总结版)
- 计算机控制实验室装置,自控/计控原理实验箱
- 微信小程序学习笔记:选项卡
- Lightroom:蒙版
- 商务出行-国外各大机场一览
- 关于excel 打开时提示 文件正在使用 正处于锁定状态 正在编辑 的不治本但简单可行的解决办法
- 考研政治---马克思主义基本原理概论---绪论
- javascript中function前面加(/!/+/-/~的含义
- 记录日常行程的微信小程序开发与实现-武汉理工大学
- java excel列宽自动换行_Excel单元格中数据如何自动换行以便适应单元格的大小
- ENSP实验六——三层交换机+路由器
- APM飞控使用动捕等外部定位
- 2020-2-16 B - Math
- 微信8.0.3测试版来了,TF直装安卓内测也来袭,附地址