当前位置: 首页 > article >正文

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

http://www.lryc.cn/news/2414209.html

相关文章:

  • 如何制作个人网站(如何搭建个人博客)
  • RedHat认证介绍
  • 2信道模型
  • android Toast大全(五种情形)建立属于你自己的Toast
  • FarPoint 基本设置
  • forall minus oracle,Oracle PL/SQL 优化与调整 -- Bulk 说明
  • 六款堪称神器的网站
  • 数学分析中的典型问题与方法_裴礼文教授编数学分析中的典型问题与方法练习1.4参考解答...
  • startx 启动的过程
  • 搜索引擎入口
  • vi局部替换操作
  • 【数据中台】开源项目(3)-Linkis
  • RedHat操作系统安装
  • 计网 | Wireshark抓包和分析腾讯视频点播详细过程
  • ThinkPHP框架USDT买卖交易网站源码修复版
  • PHP实现的网站导航条源代码
  • stable_sort的含义
  • OS X进程管理之launchctl
  • textarea 换行问题
  • com.lowagie.text.DocumentException: Font ‘STSong-Light‘ with ‘UniGB-UCS2-H‘
  • VBox 启动虚拟机失败 - NtCreateFile(\Device\VBoxDrvStub)
  • [精华]■■■关于windows installer出错的解决方案■■■
  • border和字体类型知识点笔记
  • 枚举进程,枚举窗口
  • C#中遍历所有的性能计数器PerformanceCounter
  • 中国大陆网站TOP100
  • 云的基本概念(公有云、私有云、 IaaS、PaaS、SaaS)
  • Dubbo 入门理论学习
  • Google的人体浏览器
  • Matlab的regionprops详解 连通区域