设为首页 加入收藏

TOP

14.4.3 使用鼠标绘图(2)
2013-10-07 16:12:31 来源: 作者: 【 】 浏览:97
Tags:14.4.3 使用 鼠标 绘图

14.4.3  使用鼠标绘图(2)

调用InvalidateRect()函数并不直接导致重新绘制窗口的任何一部分,这只把需要重新绘制的矩形传递给Windows。Windows维护着一个更新区-- 实际上是一个矩形,它标识窗口中需要重新绘制的整个区域。这可能源于几次InvalidateRect()调用。调用InvalidateRect()函数时指定的区域将添加到当前更新区中,所以新的更新区包括旧的更新区以及表明为无效的新矩形。最后,将WM_PAINT消息发送到窗口,然后更新区和这个消息一起传递到窗口。在处理完WM_PAINT消息时,更新区将重置为空状态。调用视图类中继承的UpdateWindow()函数,会把一个WM_PAINT消息传送给视图。

因此在绘制新创建的形状时,必须完成以下工作:

(1) 确保视图类中的OnDraw()函数在重新绘制窗口时包括新创建的元素。

(2) 调用InvalidateRect()函数,其第一个参数是指向待重新绘制元素的边界矩形的指针。

(3) 通过调用视图的继承函数UpdateWindow(),把一个WM_PAINT消息传送给视图。

类似地,如果要从窗口工作区中删除一个形状,需要完成下列工作:

(1) 从OnDraw()函数将要绘制的项中删除这个形状。

(2) 调用InvalidateRect()函数,其第一个参数指向待删除形状的边界矩形。

(3) 通过调用视图的继承函数UpdateWindow(),把一个WM_PAINT消息传送给视图。

由于自动擦除了更新区的背景,因此只要OnDraw()函数不再次绘制这个形状,这个形状就会消失。当然,这意味着必须能够获得界定所创建形状的矩形,所以要包括一个函数,把这个矩形返回为定义Sketcher元素的类的成员。

2. 定义元素的类

我们需要以某种方式把草图元素存储在一个文档中。如果要使草图具有永久性,还必须把这个文档存储在一个文件中,以便今后检索。后面将详细地讨论文件操作,就目前而言,知道MFC类CObject包括所需要的工具就足够了,所以我们将把CObject作为草图类的基类使用。

另外还有一个问题,就是无法提前知道用户创建的元素类型的顺序。Sketcher程序必须能够处理任何顺序的元素。这意味着,使用基类指针存储最新创建的元素的地址可能会使事情简单一些。调用元素类的函数时,不需要指定元素是哪种类型。例如,绘制一个元素时不需要知道它是什么。只要是通过基类指针访问这个元素,就可以始终使用虚函数获得要绘制的这个元素。现在只需要确保定义元素的类能够共享一个公共基类,并在这个类中把所有要在运行时通过多态性调用的函数声明为虚函数。这表明,可以按照如图14-12所示的方法组织元素类。

图14-12中的箭头指向每种情况下的基类。如果需要添加另一种元素类型,只需要要从CElement派生另一种类。

在Class View窗格中右击Sketcher,从弹出式菜单中选择Add | Class菜单项,即可创建CElement类。从安装的模板列表中选择MFC,然后在中心窗格中选择MFC Class项。在这个对话框中单击Add按钮,将显示另一个对话框,其中可以指定类名称,并选择基类,如图14-13所示。

在类名称框中填写CElement,并且从下拉列表中把基类选择为CObject。单击Finish按钮,则生成CElement类定义的代码:
 

  1. #pragma once  
  2. // CElement command target  
  3. class CElement : public CObject  
  4. {  
  5. public:  
  6. CElement();  
  7. virtual ~CElement();  
  8. };  

声明的唯一成员是一个构造函数和一个虚析构函数,这些函数的框架定义在Elements.cpp文件中。可以看到,这个Class Wizard包括一个#pragma once指令,以确保头文件的内容不能在另一个文件中被包括多次。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇14.4.3 使用鼠标绘图(1) 下一篇14.4.3 使用鼠标绘图(3)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)