网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
源代码在线查看: 11.2 图形的保存和重绘.txt
11.2 图形的保存和重绘
本章将在上一章己有程序 ( Graphic)的基础上继续添加图形的保存和重绘功能,为了
使程序演示效果更好,首先将己有的 Graph ic程序的窗口恢复为默认的白色背景,也就是
将 CGraphicView类的 OnEraseBkgnd函数中显示位图的代码注释起来。然后,读者可以运
行一下 Graphic程序,并利用相应菜单命令在窗口中绘制一些图形,当窗口尺寸发生变化
时,将会发现窗口中绘制的图形都消失了。这是因为当窗口尺寸发生变化时,引起窗口重绘,会发
送 WM PAINT消息,这时首先会擦除窗口的背景,然后再进行重绘操作,这样就把窗口中先前给制的
图形擦除掉了。如果希望所绘制的图形始终在窗口中呈现出来,就需要将这些图形保存起来,然后
当窗口尺寸发生变化引起窗口重绘时,将这些图形再次在窗口中输出。根据前面的知识,我们知道
当窗口重绘时总是会调用程序视类的 OnDraw函数,因此我们可以在该函数中完成图形的输出。而保
存图形的方式有多种,对于本例所绘制的图形来说,有三个要素 :起点、终点和绘制的类型(点、线、
矩形或椭圆),也就是说,对本例所绘制的每一个图形,只需要保存这三个要素就可以了。当窗口重
绘时,在 CGraphicView类的 OnDraw函数中,根据每一个己保存的图形的绘制类型,利用其起点和
终点将该图形在窗口中重新输出。由于这三个要素的数据类型不同,而在 C++中用结构体来保存不
同类型的对象是比较合适的。在 C++中,结构体就是一个类,因此,本例也可以利用一个类来保存
图形的这三个要素,这比较符合面向对象的思想。
于是,我们为 Graphic程序增加一个新类: CGraph,增加方法是单击【Insert\New Class. .】菜单
项,随后在弹出的NewClass对话框中,将新增类的类型选择为: Generic Cl臼s,如图 11.4所示。
图 11.4新增Graph类然后为CGraph这个新类增加三个成员变量(如表 11.2所示),这里将这三个变量
的访问权限都设置为public类型,因为在后面的程序中其他类需要访问它们。表11.2为CGraph类添
加的成员变量
说明
变量类型
变量名
绘制类型
uINT
m_ndrawtype
CPoint m_ptOrigin
CPoint
起点
CPoint
终点
m_ptEnd
为了能够方便地对这三个新增加的变量进行赋值,我们再为 CGraph类提供一个带参
数的构造函数(其定义代码如例 11-2所示),允许用户在构造 CGraph类的对象时,直接
通过参数给这三个成员变量赋值。
例 11-2
CGraph::CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd)
{
this->m_nDrawType=m_nDrawtype;
this->m_ptOrigin=m_ptOrigin;
this->m_ptEnd=m_ptEnd;
这样,我们在程序中,通过CGraph类就可以构造相应的对象来保存图形的三个要素。因为在绘图时
可能会绘制多个图形,所以必须为每一个图形创建一个相应的CGraph对象,以保存该图形的三个要
素。我们可以采用数组来保存这些创建的 CGraph对象,但是这样做将会非常不方便,因为数组有一
个缺点,一旦定义之后,就只能存储一定容量的元素。
而用户每次绘制的图形个数是不定的,需要创建的 CGraph对象的个数也是不定的,因此应该采用一
种动态的存储结构来保存这些 CGraph对象。本例将使用 MFC提供的-个集合类来完成这一任务。当
然,这里可以使用链表来保存这些对象,但其实现比较复杂。