Visual C++模态对话框消息处理机制的分析

Visual C++模态对话框消息处理机制的分析

ID:39252698

大小:32.50 KB

页数:5页

时间:2019-06-28

Visual C++模态对话框消息处理机制的分析_第1页
Visual C++模态对话框消息处理机制的分析_第2页
Visual C++模态对话框消息处理机制的分析_第3页
Visual C++模态对话框消息处理机制的分析_第4页
Visual C++模态对话框消息处理机制的分析_第5页
资源描述:

《Visual C++模态对话框消息处理机制的分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Visual C++模态对话框消息处理机制的分析摘要:消息驱动机制是Windows操作系统的根本,模态对话框消息处理又是不同于一般消息处理的特殊形式。通过分析这种消息机制的原理,可用来处理类似的程序设计要求。  在Windows操作系统中,面向用户的GUI基本上可分为对话框形式和文档/视图两种表现形式。对话框的显示方式又可分为模态对话框和非模态对话框,以适应不同的用户交互需求。由于对话框和文档/视图框架结构各有特色,能不能将文档/视图框架结构当作一对话框来使用,或在对话框中实现文档/视图框架结构内的特色功能呢,答案是肯定的。  下面,从Win

2、dows操作系统消息驱动机制开始,进而探讨模态对话框实现过程的消息封装、传递和处理机制,最后以模态的形式显示应用到文档/视图框架结构中的实例作为对所讲内容的验证和实践。  一、Windows消息机制  Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(messagequeue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为:typedefstructtagMSG{ HWNDhwnd; UI

3、NTmessage; WPARAMwParam; LPARAMlParam; DWORDtime; POINTpt;}MSG;   其中第一个成员变量是用来标识接收消息的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32API有对应的函数:PostMessag

4、e(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。  对于每一个正在执行的Windows应用程序,系统为其建立一个"消息队列",即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作"消息循环"的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。  消息循环代码是应用程序中主函数winmain()中类似如下的程序段:  while(GetM

5、essage(&&msg,NULL,NULL,NULL))  {file://从消息队列中取得消息   TranslateMessage(&&msg);   file://检索并生成字符消息WM_CHAR   DispatchMessage(&&msg);   file://将消息发送给相应的窗口函数  }   由此可见,所谓"消息循环",实际是程序循环。  Windows应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数,窗口函数程序代码形式上是一个巨大的switch语句,用以处理由消息循环发送到该窗口的消息,窗口函数由Windows

6、采用消息驱动的形式直接调用,而不是由应用程序显示调用的,窗口函数处理完消息后又将控制权返回给Windows。二、模态对话框的消息处理  由上面我们看到,Windows是一个巨大的消息驱动结构,由用户发出消息,系统响应处理。非模态对话框是响应一个消息,系统处理一个消息,处理完毕后返回控制权给Windows。文档/视图框架结构与其类似。模态对话框在对话框创建后,挂起外部的消息,只是响应对话框内部的消息,而外部消息则全部"过滤"掉了,直到系统接收到WM_DESTROY或WM_CLOSE后,系统返回控制权给模态对话框创建前的线程,继续模态对话框创建前

7、的线程将执行下面的代码。  让我们看看下面的对话框DoModal实现代码:{ …… //Disable父窗口(在创建对话框前) HWNDhWndParent=PreModal(); AfxUnhookWindowCreate(); BOOLbEnableParent=FALSE; if(hWndParent!=NULL&&::IsWindowEnabled(hWndParent)) {  ::EnableWindow(hWndParent,FALSE);  bEnableParent=TRUE; } TRY {  //创建模态对话框  Afx

8、HookWindowCreate(this);  if(CreateDlgIndirect(lpDialogTemplate,CWnd::FromHandle(hW

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。