基于MFC的DirectUI程序的消息响应设计

所以消息的获取仍然是来自主窗口,也就是MFC自己的一套消息映射,比如鼠标点击的消息,在主窗口截获,然后通过相关的处理,调用虚子窗口(DirectUI程序中的控件一般不是真正的窗口,没有m_hwnd,暂且称它为虚子窗口吧)的响应函数。所以DirectUI主要的问题是如何将主窗口的消息分派给虚子窗口,要解决这个问题,第一步如何定位虚子窗口。

首先主窗口有很多控件,主窗口有个控件容器,在窗口初始化时加入要显示的控件。加入的控件一般有一些属性,比如控件的大小,相对主窗口的位置,标题等。一般,主窗口有一个控件指针,指向那个将要收到消息的控件,称之为当前控件指针。比如,你要点击一个按钮,你如何确保当前控件指针指向该按钮?可以在主窗口的LButtonDown或者LButtonUp消息中遍历主窗口中所有的控件(遍历容器即可),当鼠标点击的坐标落在控件的区域中时,我们就可以确定当前控件。但是我们还没有考虑到鼠标盘旋在按钮上的情况,一般鼠标停留在按钮上时会引起按钮显示的改变,所以最好将获取当前控件的时间放在OnMouseMove消息中。

当前控件指针初始化时是空指针。在OnMouseMove消息中判断当前的控件是哪个,当然鼠标移出按钮区域时也会将其置为空指针。在其他诸如OnMouseLeave消息中也要进行相应的处理。当鼠标点击时肯定会生产LButtonDown和LButtonUp消息,根据获取到的当前控件指针来进行消息响应。那如何响应?首先各种控件的显示效果不一样,按钮点击时会凹下去,checkbox会有一个√来表明是否被选中等等。其次各种控件作用不一样,要做出的反应当然会不一样。可以利用C++的虚函数来定义统一的接口,然后各个控件会有不同的实现。所以各个控件都会从一个基类派生,初始化时将各个控件指向基类控件指针,主窗口的控件容器添加这些基类指针,这样不管处理什么消息什么控件,调用相同的接口即可以有不同的实现。控件在各种消息中调用其接口函数实现来相应其状态的改变,从而可以改变其外观,达到模拟真正Windows控件的目的。

如何实现控件的作用也是一个很重要的主题。点击按钮时主窗口如何得知按钮被点击的消息呢?我们知道每个主窗口有不同的各种控件,而相同的控件又有不同的消息形态。我们可以给主窗口发送一个自定义消息,然后消息参数自然要包括控件ID等附加参数来区分。什么时候来发送自定义消息呢?不同控件自然不同,拿最简单的Button控件来说,一般是在LButtonUp消息处理中给主窗口发送自定义消息,用SendMessage还是PostMessage视该功能过程而定。主窗口截获该自定义消息后自然可以处理该控件的响应了。

现在我们思考这样一个问题,能不能将主窗口截获控件发送的消息处理过程也定义为一个接口,这样只在该接口里处理控件的消息,从而免去每次响应不同控件消息时都要添加处理过程函数的麻烦。怎么去实现呢?我们让主窗口继承于一个接口,该接口包含消息处理的虚函数,同时让各控件都拥有该接口的一个指针,当主窗口加入控件时,将控件的该指针指向主窗口。这样当控件达到我们之前的理消息处理模型而触发消息要求时,我们可以调用接口函数。由于主窗口也是派生与该接口,同时接口中的消息处理函数是虚函数,主窗口当然可以处理控件消息了。我们注意到控件消息其实没有走主窗口的窗口过程函数或者消息队列,而是直接在主窗口中处理,我想其效率应该高些吧。

时间: 2024-10-24 22:24:46

基于MFC的DirectUI程序的消息响应设计的相关文章

1、基于MFC的OpenGL程序

首先,使用的库是GLUT以及GLAUX,先下载两者,添加查找路径以及链接 一.单文本文件   工程openGLMFC 1.创建单文本文件 2.添加路径.链接 方法如之前篇章所示, 链接库为opengl32.lib ;glu32.lib ;glut32.lib ;glaux.lib 3.头文件 在stdafx.h中加入下列语句: //openGL 所需要的头文件 #include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h

MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/details/5866213 二.在对话框中创建视图(我这里创建的是一个滚动视图): 见博文: http://blog.csdn.net/clever101/article/details/4873994 http://blog.csdn.net/clever101/article/details/37790

MFC消息响应机制分析

---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解. ---- 关键词:面向对象 消息映射 MFC 程序设计 一.引言---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库.MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效.灵活的使用MFC编程

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

MFC中消息响应机制

由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的宏. (1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明. (2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()和 END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中

MFC窗口的消息响应顺序

最开始的消息传递 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COM

MFC动态创建控件及添加消息响应

MFC动态创建控件及添加消息响应 分类: 控件技术2013-01-24 14:12 7020人阅读 评论(0) 收藏 举报 转载地址:http://blog.csdn.net/luy3728000/article/details/8193918 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放

MFC动态按钮的创建及其消息响应(自定义消息)

动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针) 3.手动释放对象指针 下面是动态生成多个按钮的例子: CButton* btn = new CButton[5]; DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; for(int i = 0; i < 5; i++) { btn[i]

MFC程序中消息以及函数的处理顺序简介[转]

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,                    然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.