我用单文档做了个程序,用于画直线、矩形等,可以对其保存、打开!用了CPtrList类链表保存每个图形,画图、保存功能正常,但是第一次运行程序打开时,虽然正确显示了打开的内容,但是接着没反应了,象似死机一样!但是如果我任意画一个图形,然后在打开,则一切正常!我没有重写OnOpen函数,这重写了DeleteContents和Serialize函数,不知道是什么原因!
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CBrush m_brush;
CPen *oldpen;
CMyGraph *g;
int w;
COLORREF col;

m_brush.CreateStockObject (NULL_BRUSH);
pDC->SelectObject (&m_brush);
POSITION p;

p=pDoc->m_data.GetHeadPosition ();

while(p)
{
CPen m_pen;
g=(CMyGraph *)pDoc->m_data.GetNext (p);
w=g->m_width ;
col=g->m_color ;

m_pen.CreatePen (PS_SOLID,w,col);
oldpen=pDC->SelectObject (&m_pen);

switch(g->m_type )
{
case 0:
pDC->MoveTo (g->m_sp );
pDC->LineTo (g->m_ep );
break;
case 1:
pDC->Rectangle (g->m_sp .x ,g->m_sp.y ,g->m_ep.x ,g->m_ep.y );
break;
case 2:
pDC->Ellipse (g->m_sp .x ,g->m_sp.y ,g->m_ep.x ,g->m_ep.y );
break;
}
pDC->SelectObject(oldpen);
}}

解决方案 »

  1.   

    void CDrawDoc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    int num;
    POSITION p;
    CMyGraph *g;
    num=m_data.GetCount ();
    ar<<num;
    p=m_data.GetHeadPosition ();
    while(p)
    {
    g=(CMyGraph *)m_data.GetNext (p);
    g->Serialize (ar);
    }
    }
    else
    {
    int num;
    int i;
    ar>>num;
    for(i=0;i<num;i++)
    {
    CMyGraph *g;
    g=new CMyGraph;
    g->Serialize (ar);
    m_data.AddTail (g);
    }
    }
    }
    void CMyGraph::Serialize(CArchive &ar)
    {

    CObject::Serialize( ar );
    if (ar.IsStoring())
    {
    ar<<m_type<<m_width<<m_sp.x <<m_sp.y <<m_ep.x <<m_ep.y <<m_color;
    }
    else
    {
    ar>>m_type>>m_width>>m_sp.x >>m_sp.y >>m_ep.x >>m_ep.y >>m_color;
    }
    }
    void CDrawDoc::DeleteContents() 
    {

    int num;
    num=m_data.GetCount ();
    for(;num>=1;num--)
    {
    delete (CMyGraph *)m_data.GetTail ();
    m_data.RemoveTail ();
    }
    m_data.RemoveAll ();

    CDocument::DeleteContents();
    }有时候还会它自己莫名其妙画出直线来,可我的画图代码却没执行,
      

  2.   

    不知道原因,但是有一个问题,你的m_brush好象没选回来,不知道会不会有影响
    这里感觉都正常的,你查查其它地方的影响吧
      

  3.   

    我已经检查假如我将所有OnDraw函数中关于画笔的语句注释了,就好了,说明问题就在画笔上,请问是什么原因啊?谢谢