CDC与CGdiObject的关系
说道CDC类就不能不提一下GdiObject---图形对象类。 在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。选择合适的图形对象和绘图对象,才能按照要求完成绘图任务。
有关CDC类的继承
父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。
子类:CClientDC-------代表 *** 作窗口的DC ,是比较常用的一个子类
CMetaFileDC ------响应Meta File的DC ,Meta File是一些GDI消息。
CPaintDC-------响应WM_PAINT消息的DC。
CWindowDC ------代表整个屏幕的DC
CDC类的数据成员
数据成员只有两个:
HDC m_hDC : CDC对象使用的输出设备上下文
HDC m_hAttribDC : CDC对象使用的属性设备上下文
二者在CDC对象创建时指向相同的设备上下文。
你先定义一个线段类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)
}
}
我发现你的自信心都快爆棚了,呵呵程序出错,首先得从自身找原因
你可以想一下,你的对话框窗口都没有创建,相当于这个东西还不存在,你怎么能从里面取得东西呢?
还有就是如果你是想在对话框中显示文字,应该首先调用DoModal()显示出来对话,然后在对话框类的OnPaint()函数中用TextOut()显示文字,如果你想实时刷新,可以采用定时器的方式OnTimer
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)