一个关于在客户区域图画的小程序,为了使图形不会在刷新后消失,我在CDocument类中利用CArray类对象保存图形,但是不知道为什么每次我刷性后图形还是会消失,我跟踪变量发现其实图形的点并未存到CArray对象m_LineArray中,但是找不到原因,还请各位大神帮我看下哪里有问题:
代码如下:
CLineDraw类的定义:
class CLineDraw : public CObject
{
public:
CLineDraw(int StartX,int StartY,int EndX,int EndY);
virtual ~CLineDraw();
void DrawLine(CDC *pDC);
protected:
int m_StartX;
int m_StartY;
int m_EndX;
int m_EndY;
};
#include "stdafx.h"
#include "SDoc.h"
#include "LineDraw.h"
// CLineDrawCLineDraw::CLineDraw(int StartX,int StartY,int EndX,int EndY)
{
m_StartX=StartX;
m_StartY=StartY;
m_EndX=EndX;
m_EndY=EndY;
}CLineDraw::~CLineDraw()
{
}
// CLineDraw 成员函数
void CLineDraw::DrawLine(CDC *pDC)
{
pDC->MoveTo(m_StartX,m_StartY);
pDC->MoveTo(m_EndX,m_EndY);
}CDocument类的添加的成员变量及成员函数:(红色部分为自己添加的成员)
class CSDocDoc : public CDocument
{
protected: // 仅从序列化创建
CSDocDoc();
DECLARE_DYNCREATE(CSDocDoc)

// 属性 
public:
int n;
CArray<CLineDraw*,CLineDraw* &> m_LineArray;
// 操作
public:
void AddLine(int StartX,int StartY,int EndX,int EndY);
CLineDraw* GetLine(int index);
int GetTotalLine();
// 重写
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);// 实现
public:
virtual ~CSDocDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DeleteContents();
afx_msg void OnEditUndo();
afx_msg void OnUpdateEditUndo(CCmdUI *pCmdUI);
};添加的成员函数实现:CSDocDoc::CSDocDoc()
{
// TODO: 在此添加一次性构造代码
m_LineArray.SetSize(0,1);
n=0;}
void CSDocDoc::AddLine(int StartX, int StartY, int EndX, int EndY)
{
CLineDraw* pLine=new CLineDraw(StartX,StartY,EndX,EndY);
m_LineArray.SetAtGrow(n,pLine);
n++;
}
CLineDraw* CSDocDoc::GetLine(int index)
{
if(index<0||index>m_LineArray.GetUpperBound())
return 0;
return (CLineDraw*)m_LineArray.GetAt(index);
}
int CSDocDoc::GetTotalLine()
{
return m_LineArray.GetSize();
}
视图类中的代码:
CSDocView::CSDocView()
{
// TODO: 在此处添加构造代码
m_bDraw=FALSE;
m_Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);}
oid CSDocView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCursor(m_Hcursor);
m_bDraw=TRUE;
m_pOld=point;
SetCapture();
CRect rt;
GetClientRect(&rt);
ClientToScreen(&rt);
ClipCursor(&rt);
CView::OnLButtonDown(nFlags, point);
}void CSDocView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bDraw=FALSE;
ReleaseCapture();
ClipCursor(NULL);
CView::OnLButtonUp(nFlags, point);
}void CSDocView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_bDraw)
{
CSDocDoc* pDoc=GetDocument();
CClientDC dc(this);
dc.MoveTo(m_pOld);
dc.LineTo(point);
pDoc->AddLine(m_pOld.x,m_pOld.y,point.x,point.y);
m_pOld=point;
} CView::OnMouseMove(nFlags, point);
}
void CSDocView::OnDraw(CDC* pDC)
{
CSDocDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//if (!pDoc)
// return;
// TODO: 在此处为本机数据添加绘制代码
int index;
index=pDoc->GetTotalLine();
while(index--)
{
pDoc->GetLine(index)->DrawLine(pDC);
}
}

解决方案 »

  1.   

    void CLineDraw::DrawLine(CDC *pDC)
    {
    pDC->MoveTo(m_StartX,m_StartY);
    pDC->LineTo(m_EndX,m_EndY);
    }另外没看到delete的地方 会导致内存泄漏
      

  2.   

    我以前用CArray同样的问题是因为CArray没有清空,直接在后面处理了
      

  3.   

    // CLineDraw 成员函数
    void CLineDraw::DrawLine(CDC *pDC)
    {
    pDC->MoveTo(m_StartX,m_StartY);
    //pDC->MoveTo(m_EndX,m_EndY);     //不认真错误 
    pDC->LineTo(m_EndX,m_EndY);
    }
      

  4.   

    呃,确实是这低级错误,晕死,delete部分的代码没贴出来,谢谢了!