十一、图形的保存和重绘
1. 转换过程:世界坐标系空间->页面空间->设备空间->物理设备空间;
世界坐标系空间和页面空间称为逻辑空间;
设备空间通常称为程序窗口的客户区;
物理设备空间通常就是指屏幕;
我们编程只负责页面空间->设备空间的转换;
设备空间->物理设备空间的转换只限于平移,程序员没法控制;
页面空间的矩形称为窗口,设备空间的矩形称为视口;
2. 设置变量时候,要是其他类要用到这个变量,那就把它设置为public;
3. CPtrArray集合类,它支持void类型的指针数组;
4. 基类中的OnPaint函数调用了OnDraw函数,所以当窗口发生重绘的时候,只需要去视类中的OnDraw改相应代码就行了;
5. 窗口滚动条的实现;
在创建向导中把视类的基类选择为CSRollView
或者把所有继承于CView的手动改成CScrollView类就行;
在视类窗口创建之后,才在创建滚动条的时候,需要进行一些设置,要利用SetScrollSizes函数;
OnInitalUpdate()函数在创建窗口之后第一个调用的函数;
6. 图形错位问题
调用GDI函数绘图时使用的逻辑坐标,而Windows需要把其转换为设备坐标,然后输出图形;
在调用OnDraw函数之前,OnPaint函数调用OnPrePareDC函数来调整显示上下文的属性;
因为每次窗口重绘的时候,都会调用OnPrePareDC函数,而OnPrePareDC会随着根据滚动窗口的位置来调整视口的原点;也就是说,视口的原点不是一成不变的,它会随着滚动条的位置不同而变化;
解决方法:在OnLButtonUp函数中增加几句:
OnPrepareDC(&dc);
dc.DPtoLp(&m_ptOrigin);
dc.DPtoLp(&point);
在MM_TEXT映射模式下,逻辑坐标单位和设备坐标单位都是像素;
7. 再介绍两种保存图形和重绘图形的方式:元文件和兼容设备描述表;
元文件要用到设备上下文类:CMetaFileDC;(存在内存中的);
元文件并没有包含所绘图形的图形数据,它包含的是图形的绘制命令;
创建元文件步骤: 1.利用CMetaFileDC构造一个元文件DC对象,然后调用该类的Create成员函数创建一个Windows元文件设备上下文,并将其已构造的CMetaFileDC对象关联起来;
2.给已创建的元文件DC对象发送一系列的GDI命令;
3.之后调用Close成员函数关闭元文件设备上下文,返回元文件句柄(HMETAFILE类型);
4.以得到的元文件句柄为参数,利用CDC类的PlayMetaFile成员函数播放该元文件;
5.元文件也是一种资源,通过调用DeleteMetaFile函数将其删除;
8. 元文件的保存与打开;
CopyMetaFile函数把Windows元文件的内容复制到指定的磁盘文件;
后缀名通常为wmf,(Windows meta File);
打开元文件:GetMetaFile
9,兼容设备描述表;(利用兼容DC在内存中准备一副图像,然后将该图像复制到目的窗口中)
记住在调用SelectObject操作将兼容位图选入兼容DC之后,还需要调用BitBlt函数将原始设备描述表的颜色及像素数据块复制到兼容设备描述表中;