CreateDialog和DialogBox

原创 2008年05月06日 19:47:00

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的区别,模态对话框与非模态对话框

INT_PTR DialogBox(          HINSTANCE hInstance,     LPCTSTR lpTemplate,     HWND hWndParent,    ...
  • u010003835
  • u010003835
  • 2015年07月22日 11:05
  • 1784

CreateDialog和DialogBox

INT_PTR DialogBox(          HINSTANCE hInstance,    LPCTSTR lpTemplate,    HWND hWndParent,    DLGPR...
  • aikker
  • aikker
  • 2010年05月28日 17:35
  • 12518

Win32API:CreateDialog、DialogBox、DialogProc

一、CreateDialog   函数功能:该宏在内存中从对话框模板上创建一个无模式对话框。此宏使用CreateDialoglndirectparam 函数。     函数原型:HWND Cr...
  • yangmengling
  • yangmengling
  • 2015年11月03日 10:53
  • 1985

非模式对话框CreateDialog() 与 模式对话框 DialogBoxParam()和DialogBox()

一、非模式对话框比模式对话框的好处是,它是作为一个独立窗口打开的,不会影响父窗口的状态,而后者打开后,关闭前父窗口是不能使用的。而且必须要对话框关闭以后,函数才会返回调用生成对话框语句的下一句。而模式...
  • c395565746c
  • c395565746c
  • 2010年04月04日 22:30
  • 10209

win32窗口创建 之 CreateDialog和DialogBox

DialogBox 函数原型: INT_PTR DialogBox( HINSTANCE hInstance,LPCTSTR lpTemplate,                    HWN...
  • dong_mingyi
  • dong_mingyi
  • 2015年02月06日 15:34
  • 942

win32 CreateDialog和DialogBox

DialogBox 函数原型: INT_PTR DialogBox( HINSTANCE hInstance,LPCTSTR lpTemplate,                    HWN...
  • u013678464
  • u013678464
  • 2014年08月10日 02:06
  • 302

DialogBOX-函数功能

该宏根据对话框模板资源创建一个模态的对话框。DialogBOX函数直到指定的回调函数通过调用EndDialog函数中止模态的对话框才能返回控制。该宏使用DialogBoxParam函数。函数原型:in...
  • zhouqian88423
  • zhouqian88423
  • 2009年12月06日 11:01
  • 810

MFC学习笔记3 Windows编程基础--DialogBox、回调、消息、控件

对话框在资源里新建对话框: 新建控件: 代码:定义回调函数// test3.cpp : Defines the entry point for the application. //#includ...
  • xundh
  • xundh
  • 2017年11月22日 13:27
  • 289

【win32】 DialogBox(参数)

int DialogBox( HINSTANCE hInstance,//handletoapplicationinstance LPCTSTR lpTemplate,//identifi...
  • for_cxc
  • for_cxc
  • 2016年07月01日 09:59
  • 1659

Windows API一日一练(17)DialogBox和DialogBoxParam函数

对话框是比较常用的窗口,比如当你想让用户输入一些参数时就可以使用对话框。或者提示一些警告的信息,都是可以使用对话框的。比如当你拷贝文件时,Windows就会提示一个拷贝文件的进度对话框。对话框的使用范...
  • caimouse
  • caimouse
  • 2007年07月27日 08:41
  • 10654
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CreateDialog和DialogBox
举报原因:
原因补充:

(最多只允许输入30个字)