MFC中的CDC是什么意思?

MFC中的CDC是什么意思?,第1张

Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基础类库定义了设备环境对象类----CDC类。

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11464996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存