mfc消息映射机制及绘制曲线

mfc消息映射机制及绘制曲线

ID:41059292

大小:266.46 KB

页数:35页

时间:2019-08-15

mfc消息映射机制及绘制曲线_第1页
mfc消息映射机制及绘制曲线_第2页
mfc消息映射机制及绘制曲线_第3页
mfc消息映射机制及绘制曲线_第4页
mfc消息映射机制及绘制曲线_第5页
资源描述:

《mfc消息映射机制及绘制曲线》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、MFC消息映射机制的剖析学会使用ClassWizard理解发送给窗口的消息是如何被MFC框架窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的;新建一个单文档应用程序,在窗口上实现画线在窗口上画线,首先要有2个点,这2个点如何去捕获?Windows应用程序是基于消息的编程当我们用鼠标在窗口中点击一下,这时就有了一个点,这个点就可以作为直线的起点。所以可以去捕获一个鼠标左键按下的消息,在这个消息响应中获取一个点。按住鼠标左键拖动然后释放左键,这时也有一个点,这个点就是直线的终点。也就是说我们要捕获2个消息,一个是鼠标左键

2、按下的消息,一个是鼠标左键释放的消息。有了这2个消息,对这2个消息进行响应,在响应的过程中可以得到起点和终点。哪个窗口响应鼠标消息呢?对于文档视图结构来说,有视图窗口和框架窗口,视图窗口始终是覆盖在框架之上的,就好像说有一面墙作为框架窗口,有一面墙它始终挡在框架窗口这面墙前面,你对框架窗口这么墙的操作始终是对它前面墙的操作,窗口也是一样,就是在框架窗口中捕获不到任何鼠标的消息。包括鼠标点击、鼠标移动。MFC消息的路由在SDK中讲过:一旦消息产生,操作系统会把消息放入消息队列中,应用程序通过GetMessage从消息队列中取出一条消息,然后DispatchMessa

3、ge交给操作系统,操作系统会调用窗口过程函数去进行处理。而在MFC中,好像不是走的这条路线。只要想捕获消息,增加消息响应函数,遵照这个步骤,就可以完成消息的响应。并不是象以前的switch~case对想捕获的消息进行处理。MFC消息的路由在MFC中,采用的是消息映射的方式。在我们的程序中。MFC在后台维护了一个句柄和c++对象的指针的对照表,也就是说,和视图类相关的有个窗口,窗口肯定有个窗口句柄,这个窗口句柄就和我们的视图类的指针对照起来。当我们收到消息的时候,消息的第一个参数就是窗口句柄,也就是说这个消息和哪个窗口相关的。通过这个句柄我们就可以找到与它相关联的c

4、++对象的指针,然后通过这个指针传递给基类,基类通过消息循环会去调用函数WindowProc来对消息进行处理。typedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;MFC消息的路由而WindowProc是个虚函数。也就是说,当子类继承CWnd时,它在后台都会有这样一个函数。在这个函数内部,调用OnWndMsg。消息的路由处理就是由它来完成的,在这个函数里完成对消息的映射的处理。我们知道消息中的窗口句柄是和一个c++对象的指针相关联的,通过这

5、个指针传给基类,这样的话它调用的都是子类的OnWndMsg。在这个函数里,看看是否有消息响应函数MFC消息的路由就是在类的头文件中看DECLARE_MESSAGE_MAP()这个宏前面是否有消息响应函数的原型声明,然后在源文件中BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()这2个宏之间是否有消息响应的映射的宏。如果通过这2个步骤找到了消息响应函数,那么就会对这个消息进行处理。这就是MFC消息映射的机制。完成画线的功能方法一:用API函数在MFC中如果要调用SDK的函数的话,要加::前缀hdc=::GetDC(m_hWnd);MoveTo

6、Ex(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc);从CWnd派生出来的类中都有一个数据成员m_hWnd保存了跟C++类对象相关的窗口句柄完成画线的功能方法二:用CDC类有一个数据成员m_hDC,它保存设备描述表,也就是与CDC这个类相关的句柄,就像m_hWnd保存窗口句柄一样。CDC*pDC=GetDC();/*CWnd中的成员函数*/pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);Release

7、DC(pDC);/*CWnd类的成员函数*/完成画线的功能方法三:用CClientDC类在构造函数中会调用GetDC得到句柄,在析构函数中会调用ReleaseDC释放句柄。所以不需要显示调用GetDC和ReleaseDC,只需要构造CClientDC类的一个对象即可。当这个对象的生命周期结束时,资源会释放掉。CClientDCdc(this);/*作图是在与视图类相关的窗口上,如何传递视图类的指针?每个类都有一个隐含的this,指向类对象本身。*/dc.MoveTo(m_ptOrigin);dc.LineTo(point);完成画线的功能框架窗口的客户区是从工具栏

8、开始,往下

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

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

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