第11课 图形的保存和重绘
来源:互联网 发布:mac地址冲突的概率 编辑:程序博客网 时间:2024/05/01 10:49
CView类的OnPaint()
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
可见,视图类窗口重绘都会调用OnDraw(),所以,在视图类中重写OnDraw即可。
1.创建4 个菜单,为其添加消息响应,用成员变量保存绘画类型。添加 LButtonDown和Up 消息。
2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据。为此创建一个新类来记录绘画类型和两个点。
class CGraph
{
public:
CPoint m_ptOrigin;// 起点
CPoint m_ptEnd;// 终点
UINT m_nDrawType;// 绘画类型
CGraph();
CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd);// 此为构造函数。
virtual ~CGraph();};
然后在void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)中加入如下代码
//CGraph graph(m_nDrawType,m_ptOrigin,point);// 不能用局部变量
//m_ptrArray.Add(&graph);// 加入这种指针数组中
/* OnPrepareDC(&dc);// 这个函数中可以重新设置窗口原点,对于滚动条中,保存数据前要调用此函数
dc.DPtoLP(&m_ptOrigin);// 将设备坐标转换为逻辑坐标
dc.DPtoLP(&point);//
CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);// 在堆中创建新的对象
m_ptrArray.Add(pGraph);*/// 加入到指针数组中
在GraphicView.h中有如下代码
CPtrArray m_ptrArray;
在OnDraw中重画时调出数据
for(int i=0;i<m_ptrArray.GetSize();i++)
3.在CView::OnPaint() 调用了OnDraw(),但在 void CGraphicView::OnPaint()中MFC 的Wizard没有调用 OnDraw(),要注意这个区别。如果你此时想调用,必须手动添加代码。 OnDraw(&dc);
4.让窗口具有滚动条的功能。
第1.将 CGraphicView的头文件中的CView全部替换成 CSrollView
第2.添加如下的代码
void CGraphicView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TOD Add your specialized code here and/or call the base class
SetScrollSizes(MM_TEXT,CSize(800,600));// 设置映射模式,设定窗口大小。 OK!
}
5.坐标系的转换,此处不再详细介绍,需要时请查阅相关资料。
SetWordTransform
几乎所有的GDI函数使用的坐标值都是采用逻辑坐标(所以,视图类的OnDraw()中使用的是逻辑坐标),Windows必须将罗技单位转换为设备单位(即像素)。
Windows对于所有的消息(WM_SIZE,WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP),所有的非GDI函数和少量GDI函数(如GetDeviceCaps函数),使用的是设备坐标。
“窗口”是基于逻辑坐标的,单位可以是像素,毫米,英寸,等。
“视口”是基于设备坐标(像素),通常,视口和客户区是对应的。
缺省映射模式是MM_TEXT,这时,逻辑单位和设备单位相同,都是像素。SetMapMode()可改变映射模式。
CView类的OnInitialUpdate()函数是在窗口创建后调用的第一个函数。该函数在OnDraw()之前调用。
CDC中提供了两个成员函数函数SetViewportOrg和SetWindowOrg,用来改变视口和窗口的原点。
OnPrepareDC(&dc) 会随时根据滚动窗口的位置来调整视口的原点。
DPToLP()将设备坐标转换成逻辑坐标。
LPToDP()将逻辑坐标转换成设备坐标。
6.解决重绘时线跑到上面的问题。为什么会错位?因为逻辑坐标和设备坐标没有对应起来。
解决方法:
在OnLButtonDown 画完图后,保存之前。调用
OnPrepareDC(&dc);// 重新设置逻辑坐标的原点!!!
dc.DPtoLP(&m_ptOrigin);// 设备坐标转化为逻辑坐标
dc.DPtoLP(&point);
CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);
m_ptrArray.Add(pGraph);
7.另外两种方法来保存数据。
一种是用CMetaFileDC:CopyMetaFile保存元文件,GetMetaFile打开元文件。
另一种是利用CreateCompatibleBitmap创建兼容DC,重绘时利用pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);
将兼容 DC的图拷贝到屏幕DC上去。
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图的位图信息头,不包含颜色表和象素数据块。因此,选入该位图对象的设备描述表不能像选入普通位图对象的设备描述表一样应用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表及象素数据块拷贝到兼容设备描述表。
0 0
- 第11课 图形的保存和重绘
- 孙鑫VC学习(第11课--图形的保存和重绘)
- 孙鑫VC++第11章图形的保存和重绘
- 图形的保存和重绘
- 图形的保存和重绘
- Lesson11 图形的保存和重绘
- 图形的保存和重绘
- Lesson11 图形的保存和重绘
- 图形的保存和重绘
- 图形的保存和重绘
- 图形的保存和重绘
- MFC中图形的临时保存和重绘
- 孙鑫MFC第十一章 图形的保存和重绘
- 孙鑫C++视频笔记(11)图形的保存和重绘
- 孙鑫C++视频笔记(11)图形的保存和重绘
- 图形的保存与重绘方法
- 图形的保存与重绘
- 【转】第十一章 图形保存和重绘
- 第10课 绘图控制
- 【挖坑记】JZOJ 4738 神在夏至祭降下了神谕
- Android隐藏的权限管理机制:AppOps
- Android笔记之获取IP、掩码、网关的有效方式
- Eclipse的使用
- 第11课 图形的保存和重绘
- spark-RDD
- 任务寄存器(Task Register)
- 移动web开发记录
- ArcGIS 10.2栅格计算器实用公式大全
- Android最流行的网络框架
- 第12课 文件和注册表操作
- Java趣味编程-日积月累-16-09-02-Total02
- C#中对ListView某一列进行刷新