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 );

相关文章推荐

6.0 三星S7相机权限问题

最近的项目中有用到拍照的功能,在使用过程中出现了三星s7 6.0系统调用相机的闪退的情况  后来发现是因为app没有获取到手机相机权限,但是在清单文件中是已经申请的,后来发现我申请的权限所有的都是被禁...

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

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

CreateDialog和DialogBox的区别,模态对话框与非模态对话框

INT_PTR DialogBox(          HINSTANCE hInstance,     LPCTSTR lpTemplate,     HWND hWndParent,    ...

API之CreateDialog

  • 2012年11月24日 14:06
  • 2.99MB
  • 下载

DialogBox Function

DialogBox Function发送反馈DialogBox 宏从体格对话框模板资源创建一个模态对话框,DialogBox 不返回控制直到指定的回调函数调用 EndDialog 函数终止了模态对话框...

原生jQuery对话框插件dialogBox

  • 2015年11月23日 18:43
  • 40KB
  • 下载

CreateDialog Function

CreateDialog Function发送反馈CreateDialog 宏从一个对话框模板资源创建一个非模态对话框,CreateDialog 宏使用 CreateDialogParam 函数语法以...

jquery弹出框插件dialogbox

  • 2015年12月04日 18:50
  • 37KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CreateDialog和DialogBox
举报原因:
原因补充:

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