`
473687880
  • 浏览: 485424 次
文章分类
社区版块
存档分类
最新评论

WIN32编程之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那样)。


备注:DialOgBox宏用CreateWindowEx函数创建对话框。DialogBox函数然后把一个WM_INITDIALOG消息(和一个WM-SETFONT消息,如果模板指定DS_SETFONT类型)传递到对话框过程。不管模板是否指定WS_VISIBLE类型,函数显示对话框,并且使拥有该对话框的窗口(也称属主窗口)失效,且为对话框启动它本身的消息循环来检索和传递消息。

当对话框应用程序调用EndDialog函数时,DialogBox函数清除对话框户止消息循环,使属主窗口生效(如果以前有效),且返回函数EndDialog调用中的nReSUlt参数。


非模式对话框跟主窗口使用同一个消息循环,而因为非模式对话框的消息会被系统主动调用这个对话框的处理函数来处理,所以在消息循环中不应该再对这个消息进行转换和分发,可以把消息循环改成这样:
// 主消息循环:
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__stdcallFlashWndProc( 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:
returnFALSE; // 没处理过的消息
}

return TRUE; // 处理过的
}

分享到:
评论

相关推荐

    window32 API大全 win32编程

    作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的。本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;...

    Win32编程常用函数

    Win32编程常用函数结构整理 WNDCLASSEX GetStockObject CreateWindow MessageBox CreatePen GetClientRect SelectObject DeleteObject MoveToEx LineTo SetPixel GetPixel CreateSolidBrush CreateHatchBrush ...

    (推荐)Win32 API大全

    作为Microsoft 32位平台的应用程序编程接口, Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务...

    VB编程资源大全(英文源码 API)

    camp-api.zip An example of editing the "win.ini" file to execute programs when Windows loads.<END><br>6 , win32api.exe This will install the Win32API.txt on your system. This file holds all API...

    Visual C++ 编程资源大全(英文源码 表单)

    31.zip Dragging a dialog by clicking anywhere on it 点击任何地方拖动对话框(11KB)<END><br>32,32.zip Splash screen with text on it that uses its own thread 通过自己的线程在Splash对话框中显示...

    VB编程资源大全(英文源码 控制)

    ASP extensions) Microsoft Visual Basic 4.x/5.x/6.x Microsoft Word, Access, Excel 95/97 (VBA) Windows Scripting Host (cscript / wscript) Perl 5.x for Win32 Inprise Delphi 4 ...

    VB编程资源大全(英文源码 控件)

    on left and right side of a text box.<END><br>40,Assist.zip A simple application with source code which shows how to save the contents of a rich text box without the help of common dialog box.<END>...

    Visual C++ 编程资源大全(源码 窗体)

    (59KB)<END><br>104,cxysplit.zip 这是一个可以在DialogBox中使用的切分类库。(21KB)<END><br>105,AutoWnd.zip 自动切分一个视图,并且高亮显示具有输入焦点的视图。(31KB)<END><br>106,MyWnd.zip 高亮显示...

    Visual C++ 编程资源大全(英文源码 图形)

    47.zip Drawing Dashed Lines and Curves 画虚的直线和曲线(9KB)<END><br>48,48.zip Drawing dotted lines 画边界线(5KB)<END><br>49,49.zip How to use 256 Color Bitmaps in ImageList (Win32 SDK ...

    VB编程资源大全(英文源码 其它)

    Copy the file with .scr extension to your computers win directory (Windows for 98, Winnt for NT) and check in screens saver settings.<END><br>73,Cls_sample_Collection.zip Implement with Class and ...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    新版的功能已经比较完善,基本上可以代替Radmin Viewer 3.5进行管理(除Intel AMT功能外),另外还增加了一些实用功能,支持Windows Xp、Vista、Win7、Win8、2003、2000、9x及相应Windows Server版等操作系统。...

    Radmin自动登录器v3.0

    新版的功能已经比较完善,基本上可以代替Radmin Viewer 3.5进行管理(除Intel AMT功能外),另外还增加了一些实用功能,支持Windows Xp、Vista、Win7、Win8、2003、2000、9x及相应Windows Server版等操作系统。...

    Microsoft Library MSDN4DOS.zip

    此库含一大古董级MS官方编程参考材料,主要针对 Windows 3.0 平台,真可谓之应用尽有: MS Windows 3.0 SDK Guide to Programming MS Windows 3.0 SDK Install. & Update Guide MS Windows 3.0 SDK Programmer's ...

    PT80-NEAT开发指南v1.1

    第三章 PT80 NEAT 编程基础 ..................................................................................................................... 17 事件驱动和消息响应机制 .................................

    visual assist v 10.4.1632 with crack

    (case=9364) 6803 Find References error messages may optionally be displayed in the status bar instead of a modal message box. (case=10226) 7038, 6997 Spelling errors in comments with XML tags...

    InstallShield Professional West Language Pack v7.0

    | installations according to Microsoft‘s exacting translation || guidelines, eliminating hundreds of hours of installation dialog || and message box translation effort. With Language Packs, one || ...

    EhLib5.0.13 最新的ehlib源码

    1. Delphi 5.x - 7.x, Delphi 9.X Win32, BDS2006 Win32, Delphi2007, CodeGear RAD Studio 2009: ------------------------------------------------------------------------------- Uninstall previous or ...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    11.我们双击文件列表的dialog.ui 文件,便出现了下面所示的图形界面编辑界 面。 12.我们在右边的器件栏里找到Label 标签器件 13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为helloworld...

Global site tag (gtag.js) - Google Analytics