标签:des http io ar sp strong on 数据 div
设备描述表是一个包含设备信息的布局体(物理设备如显示器、打印机),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);
转载自:http://www.xuebuyuan.com/1774574.html
标签:des http io ar sp strong on 数据 div
原文地址:http://www.cnblogs.com/jcy23401/p/4161046.html