Windows SDK 非模态对话框的消息处理,Windows SDK 非模态对话框的消息处理
【 tulaoshi.com - C语言心得技巧 】
Windows SDK 非模态对话框的消息处理
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)VCKBASE
在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。         
            现在对问题一(为什么要调用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,它会自己运转良好。
                        来源:http://www.tulaoshi.com/n/20160129/1483485.html
看过《Windows SDK 非模态对话框的消息处理》的人还看了以下文章 更多>>