MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标


 //方法一:通过集合类CPtrArray保存点的坐标


响应WM_LBUTTONUP消息 在OnButtonUp()函数的代码

CClientDC dc(this);

 //获得透明画刷并选中

CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(brush);

//根据不同类型绘制点、直线、矩形、椭圆
switch(m_gType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_pOrigin);     //m_pOrigin为起始点坐标
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_pOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_pOrigin,point));
break;
}
//为了处理滚动条窗口在重绘时最下端的图形会出现偏移的情况
OnPrepareDC(&dc); //调整显示上下文的属性  
//将设备点转换成逻辑点
dc.DPtoLP(&m_pOrigin);
dc.DPtoLP(&point);

//保存数据 到CGraphic类中
CGraphic* graph=new CGraphic(m_gType,m_pOrigin,point); //CGraphic 是一个自定义的类 有三个成员变量 分别表示 图形类型、起点、终点

m_ptrArray.Add(graph); //将CGraphic对象添加到CPtrArray集合类对象中保存起来



响应WM_PAINT消息  在OnDraw()函数的代码


//创建透明画刷并且选中
CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(brush);

//通过循环将集合类对象中保存的点坐标取出
for(int i=0;i<m_ptrArray.GetSize();i++)
{
switch(((CGraphic*)m_ptrArray.GetAt(i))->m_gType)
{
case 1:
pDC->SetPixel(((CGraphic*)m_ptrArray.GetAt(i))->m_pEnd,RGB(255,0,0));
break;
case 2:
pDC->MoveTo(((CGraphic*)m_ptrArray.GetAt(i))->m_pOrigin );
pDC->LineTo(((CGraphic*)m_ptrArray.GetAt(i))->m_pEnd);
break;
case 3:
pDC->Rectangle(CRect(((CGraphic*)m_ptrArray.GetAt(i))->m_pOrigin,((CGraphic*)m_ptrArray.GetAt(i))->m_pEnd));
break;
case 4:
pDC->Ellipse(CRect(((CGraphic*)m_ptrArray.GetAt(i))->m_pOrigin,((CGraphic*)m_ptrArray.GetAt(i))->m_pEnd));
break;
}
}
*/

 
/****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: SolveFlashingAndRedraw框架 包含文件: 1. ReadMe.txt 2. SolveFlashingAndRedraw MFC工程 版本号: v1.0.1 第一作者: Jef 地址: 中国/江苏 日期: 20091126 电子邮箱: dungeonsnd@126.com QQ: 420554565 (加好友时注明下载的文件名) 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw 样例工程是MFC解决窗口保存重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 运行步骤: 直接运行里面的程序,在窗口上任意拖拉鼠标画线,然后击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖此窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 如何有任何问题欢迎与作者分享!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值