孙鑫老师第十一课图像的保存重绘笔记

来源:互联网 发布:ppt图表 两个数据对比 编辑:程序博客网 时间:2024/06/07 17:57

一、保存图像
方法一:
1.保存图像,因为在此程序绘画时要确认的是绘画的类型,绘画的起点以及绘画的终点,所以我们可以用一个自定义的类CGRAPH来保存这三个元素。

2.我们可以创建一个CGRAPH的数组来存放图形的三元素,但是由于使用数组的话,数组的大小必须是确定的,这样不利于灵活性和节省内存。因此我们可以使用MFC中的动态数组类CPtrArray来保存CGRAPH的指针。CPtrArray所保存的指针类型都是void*的,但是一般类型的指针都是可以自动转换为void*,所以我们在传递参数时不用做强制类型转换。

3.创建一个对象时,如果使用关键字new的话,此对象是创建在堆上的,在函数碰到}后,一个局部对象会被销毁,但是因为是创建在堆上的,所以在堆上所保存的数据还在。

4.然后就可以在OnDraw函数中取出数组中的三元素,进行恢复绘制。

5.其实在窗口重绘时,系统首先是响应了WM_PAINT消息,在OnPaint()函数中,调用了OnDraw(&dc)函数,而OnDraw(&dc)是一个虚函数,由于我们在子类中重写了OnDraw(&dc),因此系统就调用了我们重写的函数了。如果我们在程序中重写OnPaint()函数,而在自己重写的OnPaint()中并未调用OnDraw()所以并不能自动调用。

方法二:
CMetaFileDC,利用元文件来保存绘制图形的操作。步骤如下:
1.定义一个CMetaFileDC对象,调用其构造函数。
2.使用Create()创建一个元文件的设备上下文,并将其与原文件对象关联起来。
3.使用Close()关闭元文件的设备上下文,并返回一个元文件句柄,用于显示。
4.使用PlayMetaFile来显示。
5.重新创建一个新的设备上下文。
6.在新的设备上下文中调用PlayMetaFile()来保存上一个设备上下文的句柄。
7.利用DeleteMetaFile()来删除元文件句柄。

方法三:
利用兼容DC来保存绘制图形的数据。步骤如下:
1.创建一个CDC对象,来创建兼容DC。
2.建立一个兼容位图,来设置兼容DC的大小。
3.将此兼容位图选入兼容DC,并在兼容DC中调用BitBlt方法将当前DC中的一些绘制像素大小,颜色等信息等放到兼容DC中。
4.在当前DC中调用BitBlt来显示图形。
二、关于各个坐标空间
1.WIN32 API将坐标空间分为世界坐标空间,页面坐标空间,设备坐标空间以及物理设备坐标空间。前两者也称为逻辑坐标,最后一种通常指应用程序窗口的客户区。

2.页面空间到设备空间的转换所用的是两个矩形的宽与高的比率。其中页面空间的矩形被称为窗口,设备空间的矩形被称为视口,Windows把窗口远点映射到视口远点,把窗口范围映射到视口范围,就完成了这种转换。

3.一般默认的转换为页面空间---设备空间---客户区

4.几乎所有的GDI函数中使用的坐标值都是采用的逻辑单位。Windows必须将逻辑单位转换为“设备单位”,即像素。Windows对所有的消息以及非GDI函数和某些GDI函数永远使用设备坐标。

5.窗口基于逻辑坐标,逻辑坐标可以是像素,毫米,英寸等。视口是基于设备坐标,即像素。缺省模式MM_TEXT下,逻辑单位和设备单位是一致的。

三、其他
OnInitialUpdate()是在窗口完全创建之后被第一个调用的函数,在OnDraw调用之前被调用的。

其实在MM_TEXT映射模式下,逻辑单位与设备坐标单位都是像素,窗口坐标视口坐标的转换中,主要看的就是视口原点坐标的值,OnPrepareDC(&dc)会随时根据滚动窗口的位置来调整视口的原点。

原创粉丝点击