Windows SDK 非模态对话框的消息处理

2016-01-29 11:49 41 1 收藏

Windows SDK 非模态对话框的消息处理,Windows SDK 非模态对话框的消息处理

【 tulaoshi.com - C语言心得技巧 】

Windows SDK 非模态对话框的消息处理

VCKBASE

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com) 在SDK中使用非模态对话框时,主循环中必须插入下列代码:
while(GetMessage(&msg,NULL,0,0) {     if(!IsDialogMessage(hdlg,&msg){         TranslateMessage(&msg);         DispatchMessage(&msg);      } } 
我的问题是: 为什么要调用IsDialogMessage?? 非模态对话框与主窗口有什么区别? 如果不调用IsDialogMessage,消息能不能传递到对话框? 如果一定要调用IsDialogMessage,那么如果有多个非模态对话框的话,是否对每一个非模态对话框都必须单独调用IsDialogMessage?如果真是这样,MFC是如何处理的?因为MFC隐藏了主消息循环,我如何增加对IsDialogMessage的调用?

    要搞掂这一连串的问题,首先要明白IsDialogMessage的作用,不要被它的名字搞懵。
IsDialogMessage并不是象它的名字那样用来检查对话框消息的,而是用来解释或转换消息的,更贴切的名字应该是TranslateDialogMessage。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)     与TranslateAccelerator有点类似,IsDialogMessage解释非模态对话框消息。例如,它映射Tab键和Shift+Tab键到对话框前/后的控制,并且映射箭头键到对话框相应的操作。你可以将它看成是对话框中专门内建的解释消息的加速键表。实际上,IsDialogMessage不是对话框专用的-你可以在任何有控制的窗口中使用它来实现与在对话框中一样的键盘行为。但是因为它的第一个参数是对话框的HWND,所以实际上你必须应用中的每一个非模态对话框都调用这个函数。通常当你创建对话框时可以获得一个全程的HWND类型变量g_hDlg。

    现在对问题一(为什么要调用IsDialogMessage?)的回答也同时解决了问题四中的前半部分。
    下一个要解决的问题是:MFC如何进行对话框消息的解释?在MFC中使用了一个复杂的虚函数:CWnd::PreTranslateMessage,这个虚函数让任何窗口消息自己进入主消息循环,而不用去修改窗口自身的循环。以下是CDialog::PreTranslateMessage的缺省实现代码:

BOOL CDialog::PreTranslateMessage(MSG* pMsg) {     ......// many lines of intimidating code     ......    return PreTranslateInput(pMsg); } 
换句话说,CDialog还传递消息到另一个虚函数:CWnd::PreTranslateInput
BOOL CWnd::PreTranslateInput(LPMSG lpMsg) {     if (/* keyboard or mouse message */) {         return IsDialogMessage(lpMsg);     }     return FALSE; } 
    你可能想到了CWnd::IsDialogMessage实际上是一个用m_hWnd作为HWND参数调用全程::IsDialogMessage的打包函数。这就导致了MFC中每一个对话框解释自己的输入。如果你同时运行五个对话框,每一个对话框的PreTranslateMessage都调用IsDialogMessage-所以说你就不必做什么了。MFC实在是牛啊,你压根就不必去操心IsDialogMessage,它会自己运转良好。

来源:https://www.tulaoshi.com/n/20160129/1483485.html

延伸阅读
标签: windows 操作系统
用户在Windows下与打开文件对话框打交道的次数一定不少,我们在一些软件的使用过程中,免不了要使用Windows的标准打开对话框来打开文件。但是,我们在使用Windows 2000打开文件对话框是还有一些小小的技巧,充分地利用这些小技巧,能够提高我们使用计算机的效率,同时还可以达到一些意想不到的功能。 1、快速加入特定的文件 ...
再谈 Windows 2000 “打开”文件对话框 编译/zxn 本文代码例子     不久以前,VC知识库曾探讨过如何在MFC应用中打开Windows 2000风格的“文件/打开”对话框(类似Outlook Express左边的Places Bar)。最近又有许多人问及这方面的问题,也许我在那篇文章中讲的...
问:程序是基于对话框的,我显示两个对话框,一个在另一个后面,下面是我的做法: CMyApp::InitInstance () { ... CMyDialog1 dlg1; m_hMainWnd = &dlg1; int result = dlg1.DoModal (); CMyDialog2 dlg2; result = dlg2.DoModal (); ... } 在上面的代码中,首先一个对话框得到了适当地调用...
标签: Web开发
模态对话框是,当弹出对话框时后面的内容无法操作。本次利用ajax制作的模太对话框并不是浏览器提供的模太对话框,而是通过层和ajax技术实现的虚拟的模太对话框. 样式表,css代码: .abc{          position:absolute;          left:1px;  &n...
获取静态控件文本的方法:GetDlgItem函数获得对话框中控件的指针,然后调用GetWindowText获得文本。注意:静态控件的属性必须将Notify选为可能。同理:SetWindowText可以指定文本。 获取编辑框内容:GetDlgItem(ID)-GetWindowText(); 字符内容转换为数值:atoi()把字符串转换为数值;同理:数字到字符串itoa(); GetDlgItemText(ID)可以完成...

经验教程

288

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部