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()来处理,画图部分,不过连线都画不出来。
展开
1个回答
2013-12-28
展开全部
你先定义一个线闷碰胡段类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 //使用MFC类模板 class C***Doc : public CDocument { …… protected: CTypedPtrArray 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); } }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询