本文主要是介绍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;
}
}
*/
这篇关于MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!