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);
{
public:
UINT m_nDrawType;
CPoint m_ptOrigin;
CPoint m_ptEnd;
CGraph();
CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd);
/*定义一个重载的CGraph函数用来保存每次绘图的类型、起点和终点*/
virtual ~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;
}
{
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产生的对象是放在堆中的,他的生命周期和我们的应用程序是一致的。*/
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);
pDC->SelectObject(pBrush);
//创建画刷,并将画刷放到设备容器当中
for (int i=0;i<m_ptrArray.GetSize();i++) //获得指针数组长度,逐个绘制
{
switch(((CGraph*)m_ptrArray.GetAt(i))->m_nDrawType)
{
{
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;
}
}
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函数将不起作用。