MFC中用CDC类重绘问题

用CDC完成类似于windows画板中铅笔的功能,如何能在窗口的我时候继续保留我所画的东西?下面是我使用的方法,铅笔功能能完成,不过界面放大缩小的过程中并不能保留我所画出... 用CDC完成类似于windows画板中铅笔的功能,如何能在窗口的我时候继续保留我所画的东西?下面是我使用的方法,铅笔功能能完成,不过界面放大缩小的过程中并不能保留我所画出来的图形。请达人说明我用的方法错误的地方。我是一个VC的刚刚入门的菜鸟。
以下代码均写在CView类中:
在类头文件中定义私有变量 BOOL fg;CPoint pt1;CPoint pt2;
在WM_LBUTTONDOWN消息处理函数中(point为鼠标按下时所在的坐标点) fg=TRUE;pt1=point;
在WM_LBUTTONUP消息处理函数中 fg=FALSE;
在WM_MOUSEMOVE消息处理函数中(point为鼠标移动一个像素之后产生的点)
if(fg==TRUE)
{pt2=point;
CClientDC dc(this);
OnDraw(&dc);//CClientDC继承于CDC类,所以我在这里传了一个子类的dc
pt1=pt2;
}
在OnDraw函数中
if(fg==TRUE)
{
pDC->MoveTo(pt1);
pDC->LineTo(pt2);
}//完成
并且类似的我也试过用OnPaint()来处理,画图部分,不过连线都画不出来。
展开
 我来答
测绘地理信息
2008-05-27 · TA获得超过2204个赞
知道小有建树答主
回答量:516
采纳率:100%
帮助的人:472万
展开全部
你先定义一个线段类CLine,在其头文件中定义pt1和pt2,并定义一个成员函数DrawLine(),代码如下:
class CLine : public CObject
{
private:
CPoint pt1;
CPoint pt2;
public:
CLine(CPoint p1, CPoint p2);
virtual ~CLine();
void DrawLine(CDC *pDC);
};

在实现文件Line.cpp中编写如下代码:
CLine::CLine(CPoint p1, CPoint p2)
{
pt1=p1;
pt2=p2;
}

void CLine::DrawLine(CDC *pDC)
{
pDC->MoveTo(pt1);
pDC->LineTo(pt2);
}

要使用一个动态数组来保存已画好的线段,为此在文档类C***Doc的头文件中定义下面的成员变量和成员函数,并包含定义类Line的头文件:
#include "Line.h"
#include <afxtempl.h> //使用MFC类模板
class C***Doc : public CDocument
{
……
protected:
CTypedPtrArray<CObArray,CLine *> m_LineArray; //存放线段对象指针的动态数组
public:
CLine * GetLine(int nIndex);
void AddLine(CPoint p1, CPoint p2);
int GetNumLines();
……
};

在实现源文件***Doc.cpp中编写如下代码:
void C***Doc::AddLine(CPoint p1, CPoint p2)
{
CLine *pLine=new CLine(p1, p2);
m_LineArray.Add(pLine);
}

CLine *C***Doc::GetLine(int nIndex)
{
if(nIndex<0 || nIndex>m_LineArray.GetUpperBound())
return NULL;
return m_LineArray.GetAt(nIndex);
}

int C***Doc::GetNumLines()
{
return m_LineArray.GetSize();
}

在WM_MOUSEMOVE消息处理函数OnMouseMove()中还要加入以下代码:
void C***View::OnMouseMove(UINT nFlags, CPoint point)
{
if(fg)
{
C***Doc *pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->AddLine(m_ptOrigin,point);
//其中m_ptOrigin是你在C***View中定义的起始点坐标
……
}
}

最后在OnDraw()函数中实现重绘:
void C***View::OnDraw(CDC* pDC)
{
CMyDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int nIndex=pDoc->GetNumLines();
while(nIndex--)
{
pDoc->GetLine(nIndex)->DrawLine(pDC);
}
}
百度网友6452b3628
2008-05-27 · TA获得超过1.7万个赞
知道大有可为答主
回答量:4881
采纳率:0%
帮助的人:5333万
展开全部
必须要一个Point数组,把已经画过的保存起来

msdn里面有个叫做Scribble的例子可以参考。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xcdhyi
2008-05-27 · 超过12用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:40.7万
展开全部
你得修改OnSize()函数吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式