- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课:MFC画图MFC消息映射机制的剖析
MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。
主要介绍一些绘图方面的知识。
程序实例:
新建工程:-MFC AppWizard[exe] 文件面为Draw 选择单文档的应用程序 完成之后编译运行。
画直线、画图、画刷画位图、空白画刷操作步骤
? 明确画图的思路:按下鼠标左键画图的原点,拖动鼠标到另外一个位置松开鼠标左键画图的终点。
? 画图需要消息的捕获。捕获的对象是鼠标左键按下WM_LBUTTONDOWN和抬起WM_LBUTTONUP的消息。
? 这两消息的捕获、响应在窗口类中进行,可以在框架类Frame类中也可以在视类View类中。
? 要对消息进行捕获我们需要设置一些额外的函数,这些函数MFC都有提供。如我们在CMainFrame上点击右键选择增加windows消息处理Add windows message handler……,选择WM_LBUTTONDOWN点击“Add Handler”添加而后点击“Edit Existing”退出。CMainFrame message handlers在CMainFrame最底下被创建。具体内容详见下面程序代码。(这段代码添加的位置是在implementation of the CMainFrame class中,文件名为CMainFrame.cpp)
? 为了简单说明每一步的作用这个程序做出的反应,在消息响应函数中添加一个MessageBox程序代码,这个MessageBox要比先前的WinApi中使用的少一个” HWND hWnd,”参数。MessageBox在CWnd中是属于其中的一个成员函数,他不需要句柄因为有一个数据成员保存了和这个窗口相关的句柄。这里只有一个MessageBox函数在Run的时候没有弹出来!具体原因看注意。
? 作为对比我们在CDrawView中也添加一个消息响应函数WM_LbuttonDown,同样设置一个MessageBox函数,这个函数的参数LpszText为”View click!”。Run我们发现这个消息弹出来了。
? 把框架类的的对WM_LBUTTONDOWN响应的OnLButtonDown函数删除。删除方法看注意。
? 查看当我们增加WM_LBUTTONDOWN这个消息响应的时候在头文件和源文件里边都增加了些什么。增加的程序代码详见5 。当我们增加一个消息响应函数的时候会在三个地方增加代码,头文件中消息原型声明、源文件中跟消息响应函数关联的宏、源文件中消息响应函数。这里在构造函数中给成员变量赋初值。
? MFC中的消息响应。粗略的来看MFC中的消息响应跟WinAPI中消息响应不一样没有调用GetMessage函数,也没有调用回调函数进行消息响应,MFC中对消息的处理方法为消息映射。
? 继续画图。我们调用的OnLButtonDown(UINT nFlags, CPoint point)里边的CPoint类,这个类就是代表了一个点。当我们按下鼠标左键这个点的参数已经通过CPP的对象传递进来,所需要做的就是在这个响应函数中把这个点的参数保存。做法:View类中增加一个私有成员变量 CPoint m_ptOrigin ,View构造函数中将这个点初始化为零,在On_LButtonDown中用给这个点的赋值语句” m_ptOrigin=point;”代替MessageBox函数保存点的参数,见程序段8
? 对终点的响应,也就是对鼠标左键弹开的响应。要增加消息响应函数WM_LBUTTONUP.。
? 添加变量HDC hdc ,用hdc保存获取到的View类窗口所表示的窗口的句柄,获取窗口句柄的程序段:hdc=::GetDC(m_hWnd);
? 作图函数:MoveToEx 。 先将点移动到源点然后再到终点,画线用LineTo划一条线。至此用API函数画图就已经结束了。相关的程序段见10
? MFC给我们封装了一个画图的代码。MFC将所有跟窗口相关的封装到了CWND中所有跟左图相关的都封装到了CDC中。用MFC提供的封装函数CDC进行画图
? 第三种做图的方式CClientDC封装函数作图。
? 如果我们想要获得View窗口的父窗口指针即Frame框架窗口指针(句柄),怎么做呢?看注意。
? 第四种作图方式:CWindowDC ,与CClientDC一样在构造的时候自己调用GetWindowDC再析构的时候自己调用ReleaseDC 。不过CWindowDC作图区域范围更广了
文档评论(0)