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()来处理,画图部分,不过连线都画不出来。 展开
以下代码均写在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()来处理,画图部分,不过连线都画不出来。 展开
3个回答
展开全部
你先定义一个线段类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);
}
}
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);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询