关于MFC窗口重绘时图像消失的问题

voidCDrawView::OnLButtonDown(UINTnFlags,CPointpoint){m_ptOrigin=point;CScrollView::On... void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptOrigin=point;
CScrollView::OnLButtonDown(nFlags, point);
if(m_nDrawType==0)
{
isDrawing=true;
CDrawDoc* pDoc = GetDocument();
m_stroke.m_pointArray.Add(m_ptOrigin);
}
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{

CDrawDoc* pDoc = GetDocument();
m_stroke.m_pointArray.Add(point);
isDrawing=false;

CStroke *pstroke=new CStroke;
pstroke=&m_stroke;
pDoc->m_list.Add((CObject*)pstroke);
m_stroke.m_pointArray.RemoveAll();

CScrollView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
CDrawDoc* pDoc = GetDocument();
if(m_nDrawType==0 && isDrawing)
{
m_stroke.m_pointArray.Add(point);
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;

}
CScrollView::OnMouseMove(nFlags, point);
}

void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int count0=pDoc->m_list.GetSize();
int j=0,h=0;
// TODO: add draw code for native data here
CClientDC dc(this);
for(;j<count0;j++)
{
int countEx=((CStroke*)pDoc->m_list.GetAt(j))->m_pointArray.GetSize();
for(;h<countEx-1;h++)
{
dc.MoveTo(((CStroke*)pDoc->m_list.GetAt(j))->m_pointArray.GetAt(h));
dc.LineTo(((CStroke*)pDoc->m_list.GetAt(j))->m_pointArray.GetAt(h+1));
}
h=0;
}
dc.SelectObject(pOldPen);
}

其中:
各个变量的定义为:
##CStroke.h文件:
class CStroke : public CObject
{
DECLARE_SERIAL( CStroke )
public:
CArray<CPoint,CPoint> m_pointArray;
COLORREF m_color;
CStroke();
void Serialize(CArchive&);
virtual ~CStroke();
};

##DrawDoc.h文件
CObArray m_list;

##DrawView.h文件
CStroke m_stroke;
CPoint m_ptOrigin;
int m_nDrawType;

(其余细节略)

在屏幕上画几条曲线,改变窗口大小后就消失了,不知道怎么改。。。
我改成这样:
CStroke *pstroke=new CStroke;
int n=m_stroke.m_pointArray.GetSize();
for(int i=0;i<n;i++)
{
pstroke->m_pointArray[i]=m_stroke.m_pointArray[i];
}
pDoc->m_list.Add((CObject*)pstroke);
m_stroke.m_pointArray.RemoveAll();
编译时没错,执行时就出错了。。。不知道怎么回事。。

PS:我的思路是:在view文件中定义CStroke对象m_stroke,在Document中定义CObArray对象m_list。每画一条直线,用view中的m_stroke接受点列的数据,再把这个m_stroke添加到m_list中,然后把m_stroke清空,接收下一条直线的数据,我想知道是不是RemoveAll()之后m_list中的指向m_stroke的元素也被抹掉了?
展开
 我来答
无尽星空ljm
2010-08-03 · TA获得超过1793个赞
知道小有建树答主
回答量:441
采纳率:0%
帮助的人:0
展开全部
问题出在OnLButtonUp()函数,分析如下:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{

CDrawDoc* pDoc = GetDocument();
m_stroke.m_pointArray.Add(point);
isDrawing=false;

CStroke *pstroke=new CStroke; //创建了一个新的Stroke,并把指针赋给pstroke
pstroke=&m_stroke; //但是这句又把上句的pstroke给覆盖了!!!
pDoc->m_list.Add((CObject*)pstroke); //这句添加的实际上是m_stroke的地址
m_stroke.m_pointArray.RemoveAll(); // 把m_stroke的点全清空了,所以,最终的结果就是什么点都没有了,pDoc->m_list中存贮了很多m_stroke的地址(都是相同的!),但没有任何点。

CScrollView::OnLButtonUp(nFlags, point);
}

修改建议:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{

CDrawDoc* pDoc = GetDocument();
m_stroke.m_pointArray.Add(point);
isDrawing=false;

CStroke *pstroke=new CStroke;
//下面这句应该是复制m_stroke的内容到*pstroke中。如果CStroke有拷贝构造函数,那么可以使用*pstroke=m_stroke,如果没有,则采用有类似功能的其他语句,比如Copy语句,或者,实在不行就挨个点添加一次。就像这样:
int n=m_stroke.m_pointArray.GetSize();
for(int i=0;i<n;i++)
pstroke->m_pointArray.Add(m_stroke.m_pointArray.GetAt(i));

pDoc->m_list.Add((CObject*)pstroke);
m_stroke.m_pointArray.RemoveAll();

CScrollView::OnLButtonUp(nFlags, point);
}
测绘地理信息
2010-08-03 · TA获得超过2204个赞
知道小有建树答主
回答量:516
采纳率:100%
帮助的人:470万
展开全部
将OnDraw里面的dc.全部改成pDC->。在OnDraw里面,不需要这样定义的:
CClientDC dc(this);
OnDraw里面本来就有一个参数pDC用来绘图的:
OnDraw(CDC* pDC)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c4ca32c
2010-08-04
知道答主
回答量:33
采纳率:0%
帮助的人:15.9万
展开全部
学习下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式