关于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的元素也被抹掉了? 展开
{
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的元素也被抹掉了? 展开
3个回答
展开全部
问题出在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);
}
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);
}
展开全部
将OnDraw里面的dc.全部改成pDC->。在OnDraw里面,不需要这样定义的:
CClientDC dc(this);
OnDraw里面本来就有一个参数pDC用来绘图的:
OnDraw(CDC* pDC)
CClientDC dc(this);
OnDraw里面本来就有一个参数pDC用来绘图的:
OnDraw(CDC* pDC)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询