图形的保存和重绘

1、根据前面点线面的绘制,我们发现一点,当窗口大小发生变化时,也就是窗口发生重绘时,我们画的图形不见了。这里我们编写代码来保存和重绘图形。
首先,新建一个从Generic Class继承的CGraph类,用来保存每次绘图时的类型,起点,和终点。
class CGraph 
{
public:
 UINT m_nDrawType;
 CPoint m_ptOrigin;
 CPoint m_ptEnd;
 CGraph();
 CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd);
/*定义一个重载的CGraph函数用来保存每次绘图的类型、起点和终点*/
 virtual ~CGraph();
};
 
然后,填充CGraph函数,将view中绘图的类型、起点、终点的值放到函数内
CGraph::CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd)
{
 this->m_nDrawType=m_nDrawType;
 this->m_ptOrigin=m_ptOrigin;
 this->m_ptEnd=m_ptEnd;
}
 
接着,在OnLButtonUp函数中,绘图部分的后面,回调函数之前,插入如下代码,将绘图元素保存到 CPtrArray指针数组中
 /*CGraph graph(m_nDrawType,m_ptOrigin,point); 
 m_ptrArray.Add(&graph);
 如果使用上面方法因为,LButtonUp函数结束时,graph的生命周期也结束了,所以
 Add到m_ptrArray中的指针所指的内存空间,已经没有graph对象了。必须改成如下形式。*/
 CGraph *pGraph = new CGraph(m_nDrawType,m_ptOrigin,point);
 m_ptrArray.Add(pGraph);
 /*new产生的对象是放在堆中的,他的生命周期和我们的应用程序是一致的。*/
 
最后,在View类的OnDraw函数中添加以下代码:
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
 pDC->SelectObject(pBrush);
//创建画刷,并将画刷放到设备容器当中
 for (int i=0;i<m_ptrArray.GetSize();i++)        //获得指针数组长度,逐个绘制
 {
  switch(((CGraph*)m_ptrArray.GetAt(i))->m_nDrawType)
  {
//重新根据保存在指针数组中的绘图类型,和起止点,作图。
   case 1:
    pDC->SetPixel(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd,RGB(0,0,0));
    break;
   case 2:
    pDC->MoveTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin);
    pDC->LineTo(((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd);
    break;
   case 3:
    pDC->Rectangle(CRect(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin,
     ((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd));
    break;
   case 4:
    pDC->Ellipse(CRect(((CGraph*)m_ptrArray.GetAt(i))->m_ptOrigin,
     ((CGraph*)m_ptrArray.GetAt(i))->m_ptEnd));
    break;
  }
 }
 
*注意,如果程序中有对WM_PAINT的消息相应函数,则必须在消息相应函数中再调用OnDraw函数,否则因为OnDraw函数,默认是在OnPaint响应函数中被调用的,如果有别的WM_PAINT消息响应函数重载,则默认的OnPaint函数将不起作用。
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值