您的位置:首页 > 其它

DC、CDC及CDC的各个子类

2013-10-31 14:52 141 查看
设备描述表是一个包含设备信息的布局体(物理设备如显示器、打印机),MFC中关于图像操纵都须要DC来完成。

    HDC是Windows的一种数据类型,是设备描述句柄;

    CDC是MFC封装的Windows 设备相干的一个类;
    CClientDC是CDC的衍生类,产生对应于Windows客户区的对象,在机关的时辰调用GetDC,在析构的时辰调用ReleaseDC;

     CWindowDC也是CDC的衍生类,在机关的时辰调用GetWindowDC,在析构时调用ReleaseDC,可接见CWnd的全部屏幕,包含客户去和非客户区。

 

CDC是Windows画图设备的基类。
CClientDC:
(客户区设备高低文)用于客户区的输出,与特定窗口接洽关系,可以让开辟者接见目标窗口中客户区,其机关函数中包含了GetDC,析构函数中包含了ReleaseDC
CPaintDC:

(1)仅限于OnPaint处理惩罚法度,用于响应窗口重绘消息(WM_PAINT)时的画图输出。CPaintDC在机关函数中调用BeginPaint()取得设备高低文,在析构函数中调用EndPaint()开释设备高低文。EndPaint()除了开释设备高低文外,还负责从消息队列中清除WM_PAINT消息。是以,在处理惩罚窗口重画时,必须应用CPaintDC,不然WM_PAINT消息无法从消息队列中清除,将引起络续的窗口重画。CPaintDC也只能用在WM_PAINT消息处理惩罚之中。

(2)CPaintDC在机关函数中调用BeginPaint()取得设备高低文,在析构函数中调用EndPaint()开释设备高低文。EndPaint()除了开释设备高低文外,还负责从消息队列中清除WM_PAINT消息。是以,在处理惩罚窗口重画时,必须应用CPaintDC,不然WM_PAINT消息无法从消息队列中清除,将引起络续的窗口重画。

(3)CPaintDC也只能用在WM_PAINT消息处理惩罚之中。
CWindowDC:

(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。

(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。

(3)接洽关系一特定窗口,容许开辟者在目标窗口的任何一项目组进行画图,包含鸿沟与题目,这种DC同WM_NCPAINT消息一路发送

申明:在画图时推荐应用CClientDC,CPaintDC和CWindowDC对象,而不推荐直接应用CDC对象,CWindowDC的机关函数调用GetWindowDC获取窗口DC(包含非客户区),析构函数中调用ReleaseDC,当须要对窗口非客户区操纵时应用。

以画线为例,上方几种DC的应用代码如下:

HDC hDC;
hDC = ::GetDC(m_hWnd);
MoveToEx(hDC,m_ptOrigin.x,m_ptOrigin.y,NULL);

LineTo(hDC,point.x,point.y);

::ReleaseDC(m_hWnd,hDC);

CDC * pDC = GetDC();
pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

ReleaseDC(pDC);

CClientDC dc(this);
//CClientDC dc(GetParent());

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

//CWindowDC dc(this);//this代表只能在view区域绘画

//CWindowDC dc(GetParent());//在全部frame区域绘画

CWindowDC dc(GetDesktopWindow());//可在全部桌面区域绘画

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

 

HDC就是最原始的 DC 句柄,很多API的第一个参数就是一个HDC类型,比如

 HDC hDC = ::GetDC( m_hWnd);

 ::MoveToEx( hDC, 0,0, NULL );   

 ::LineTo( hDC, 0, 100, );

 ::ReleaseDC( m_hWnd, hDC );

 

在MFC中,为了将API封装成一个类来操纵,是以多出来了一个CDC。所以在MFC中,都是

 CDC dc = GetDC();

 dc.MoveTo( 0,0 );

 dc.LineTo( 0,100 );

 this->ReleaseDC( &dc );

 

但如许还不敷,因为 CDC还要你本身去开释,所有MFC中又多出来一个CClientDC, 如许你就可以如许了:

 CClientDC dc(this);

 dc.MoveTo( 0,0 );

 dc.LineTo( 0,100 );

CClientDC的析构函数本身会开释本身。

DC不是什么对象,就是设备高低文的简称。

与CClientDC一样,还有CWindowDC,CPaintDC,只是它们的绘制局限不一样。

但弄到底,都只是HDC的一些封装罢了,你可以在CDC类中直接引用 m_hDC,这就是那个原始的HDC句柄了-

HDC、CDC、CClientDC、CWindowDC、CpaintDC

hdc是dc的句柄,CDC是一个封装的dc类,后面这三个dc就是应用的场合稍有差别,都是派生自cdc的,第一个是客户区dc,经常用,第二个是窗口dc,针对全部窗口画图,cpaintdc如同只在onpaint函数中应用吧

 

CDC是MFC对HDC的封装,CDC和HDC可以彼此转换:

HDC hdc = pDC->GetSafeHdc(); // pDC is CDC*,由CDC获得HDC

CDC* pDC = CDC::FromHandle(hdc);//由HDC获得CDC

FromHandle:

static CDC* PASCAL FromHandle( HDC hDC );

返回值:

用于立即应用的姑且指针。

备注:

当给定设备高低文的指针时,则返回CDC对象的指针。若是CDC对象未与句柄相连,将创建一个姑且CDC对象并与之相连。(看看句柄所指窗口是否存在.存在的话就会返回这个窗口指针.)

 

CClientDC、CWindowDC这两个尽量不消吧,它们对于WS_CLIPCHILDREN属性是忽视的。

CPaintDC是MFC里面用得最多的,实际上CDC*往往是CPaintDC的对象。

WS_CLIPCHILDREN

 

兄弟:不要管那些XXDC,只要记住怎么用HDC就可以了,所有的DC类,底层都是在折腾HDC,不如你直接学会玩HDC.别搭理那些鸟DC,那些DC,都可以提炼出HDC的,提出来就像CDC
*pDC;提炼HDC:pDC->m_hDC;搞到HDC本身用API画什么不可?

 

 

CDC类及其子类---CClientDC、CWindowDC和CPaintDC

CDC类

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

父类:从 CObject 直接持续而来。持续了CObject类的各类特点,如动态创建等等。

 

例如用GDI画矩形要Rectangle(hDC,...),而应用CDC则是dc.Rectangle(...),由此可见CDC主如果把底本须要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。  

CPaintDC CWindowDC CClientDC:他们都是从CDC持续,分别是对上方所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC机关时调用BeginPaint,析构时调用EndPaint,其余同理)。

 

数据成员只有两个:

HDC m_hDC : CDC对象应用的输出设备高低文

HDC m_hAttribDC : CDC对象应用的属性设备高低文

 

CClientDC子类

CClientDC类只能在客户区画图;

所谓客户区指窗口区域中去掉边框、题目栏、菜单栏、对象栏、状况栏等之外的项目组,它是用户可以操纵的区域;

在应用CClientDC进行画图时,一般要调用GetClientRect()函数来获取客户区域的大小;

CClientDC类在机关函数中调用Windows API函数GetDC(),在析构时响应ReleaseDC();

CClientDC类的窗口句柄保存在成员变量m_hWnd,为机关CClientDC,需将CWnd作为参数传递给机关函数。

CWindowDC子类

CWindowDC对象在机关时调用Windows API函数GetWindowDC,在析构时调用响应的API函数ReleaseDC,这意味着CWindowDC对象可接见CWnd所指向的为全部全屏幕区域;

CWindowDC容许在显示器的随便率性地位画图。坐标原点在全部窗口的左上角。

在应用CWindowDC进行画图时,一般要调用GetWindowRect函数来获取全部应用法度窗口区域的大小;

CWindowDC类的窗口句柄保存在成员变量m_hWnd,为机关CClientDC,需将CWnd作为参数传递给机关函数。

CPaintDC子类

凡是CPaintDC用来响应WM_PAINT消息。一般应用在OnPaint函数. 

CClientDC也是从CDC派生出来的.机关时主动调用GetDC函数,析构时主动调用ReleaseDC函数.一般应用于客户区窗口的绘制.

CPaintDC只能在WM_PAINT消息中应用, 用于有重画消息发出时才应用的内存设备景象, 而CClientDC和客户区相干,有重画消息发出时才应用的内存设备景象, 可在任何处所应用.

在处理惩罚窗口重画时,必须应用CPaintDC,不然WM_PAINT消息无法从消息队列中清除,将引起络续的窗口重画。

 

GDI是什么?GDI是微软供给的图形编程库。

DC是什么?DC是GDI库里定义的一种概念罢了。执着于DC到底是什么,没有任何意义,因为微软没有露出出任何干于DC的实现。

HDC是一种HGDIOBJ。就像奥迪是汽车的一种。

创建透明画刷:

CBrush *pBrush=CBrush::

FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); 

函数原型:

HGDIOBJ GetStockObject(int fnObject);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: