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相关推荐
- oracle dialog运行,win32窗口创建 之 CreateDialog和DialogBox
DialogBox 函数原型: INT_PTR DialogBox( HINSTANCE hInstance,LPCTSTR lpTemplate, HWND hWndParent,DLGPROC l ...
- Win32API:CreateDialog、DialogBox、DialogProc
一.CreateDialog 函数功能:该宏在内存中从对话框模板上创建一个无模式对话框.此宏使用CreateDialoglndirectparam 函数. 函数原型:HWND CreateDialog ...
- CreateDialog和DialogBox的区别,模态对话框与非模态对话框
INT_PTR DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DL ...
- win32 CreateDialog和DialogBox
INT_PTR DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DL ...
- 优秀编程团队需要改善的12件事情
你听说过SEMA么? 它是一个用来测试一个软件团队有多好的相当深奥的系统.不,等等!不要手贱点开这个链接!它会花费你大概六年的时间来了解这个东西.所以我提出了我自己 的.跟它相比极不负责任的.草率的评 ...
- The Joel Test:Joel 用来评价软件开发团队成熟度的12个问题
转自:http://www.cnblogs.com/supercpp/archive/2011/11/10/2245087.html 如果你与软件行业有若干联系,但是还不知道Joel这个人以及他的博客 ...
- 【翻译】乔尔测试:改进代码的12步
翻译文章:<乔尔测试:改进代码的12步>,欢迎提意见. 原作者:Joel Spolsky 原文链接:原文链接 JOEL谈软件 我叫 Joel Spolsky, 是纽约市的一名软件开发者.更 ...
- 对话框窗口过程与普通窗口过程的区别
对话框窗口是指通过CreateDialog,DialogBox 这些API创建的窗口,其中DLGPROC与普通窗口有一些区别. HWND WINAPI CreateDialog(_In_opt_ HI ...
- WinRAR4.01破解版破解过程
WinRAR是我们平时最常用到的软件之一,由于它并非免费软件,试用期过后,每次打开winRAR都会提示请注册的对话框,令人烦不胜烦.于是,我一般的做法是下载低版本的被破解后的winrar使用(最新版的 ...
最新文章
- mysql数据库中的十进位是什么意思?
- python怎样定义一个数组_Python创建数组
- DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字
- hdu1796容斥原理
- IplImage类型解释和举例
- yield的用法详解
- 多线程小抄集(新编四)
- XML——XML概述
- 【转】理解SQL Server的安全对象和权限
- mysql报错 DuplicateKeyException分析与解决
- 0x02是什么意思_学习STM32时为什么要学习汇编?
- 是否应该扔掉就代码,重写整个软件?
- leetcode python3 简单题125. Valid Palindrome
- mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏
- [CS] 发起Conference Call
- redhat linux 设置ip,REDHAT LINUX企业版更改IP地址,网关,DNS和MAC地址----字符界面
- MapGis67读取点线区
- 代理服务器和反向代理服务器
- Android监听前后台切换展示开屏广告
- 计算机音乐文爱图片,CG/贺敬轩《文爱》[FLAC/MP3-320K]