DC、CDC及CDC的各个子类

设备描述表是一个包含设备信息的结构体(物理设备如显示器、打印机),MFC中关于图像操作都需要DC来完成。
HDCWindows的一种数据类型,是设备描述句柄;
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);

时间: 2024-12-09 00:27:11

DC、CDC及CDC的各个子类的相关文章

Data Flow ->> CDC Control Task, CDC Source, CDC Splitter

CDC Control Task可以从控制CDC数据同步,比如初始化加载.LSN范围的管理.它可以代替另一种做法,就是通过调用一批CDC函数来完成同样的事情.从SSIS的角度来完成,事情编程简单,和另外两个空间配合起来(CDC Source,和CDC Splitter),仅需配置一些控件参数便可以完成整个数据抽取过程. CDC Source从启用了CDC的数据表中查询数据 CDC Splitter和Conditional Split组件功能相似.它生成三个数据流分支:Inserts, Updat

Oracle Data Integrator 12c----简单CDC(Simple CDC)

Simple CDC最简单的一种 CDC.在这里,每一张 CDC 的表的变化都是独立捕获的,不需要考虑多张存在主外键引用关系的表之间的数据一致性. 1 环境准备 源表:ODI_SRC.DEPT 目标表:ODI_TAG.DEPT 配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle) 模型反向工程见:Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore) 2导入并配置JKM 首先在项目中导入 JKM JKM Oracle Simp

Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)

一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性的CDC. 1 环境准备 源表:ODI_SRC.DEPT,ODI_SRC.EMP 目标表:ODI_TAG.DEPT, ODI_TAG.EMP 配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle) 模型反向工程见:Oracle Data Integrator 12c-模型(Model

MFC中的DC,CDC和HDC

       设备描述表(DC)是Windows中的一种数据结构,它包含GDI需要的所有关于显示界面情况的描述字段,包括相连的物理设备和各种各样的状态信息. 图形显示功能是由显卡来完成的,你想要利用显卡的图形显示功能来完成你的图形输出,怎么办,给你一块硬件能用吗?好,现在厂商给你提供一个驱动程序,给你一些调用的接口,你就可以访问了吧.但这种访问是在驱动层,很麻烦,更麻烦的是,每个厂商给自己显卡提供的驱动程序还不一样,那我们写的图形输出程序岂不是换台机器(不一样的显卡)就得修改,一个字:累,两个字

CDC与HDC的区别以及相互转换

CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类). CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄. 记住下面的一句话,会有助于你的理解. MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使

VC++ 中CDC与HDC的区别以及二者之间的转换

MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类). CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄. 记住下面的一句话,会有助于你的理解. MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记). 如果将window

VC中CDC与HDC的区别以及二者之间的转换

CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类). CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄. 记住下面的一句话,会有助于你的理解. MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使

GDI图形、C\HDC\CDC

l         GDI图形接口 l         绘制图形 l         DC,HDC设备CDC类 l         绘制矩形        一.了解GDI与GUI    GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. 在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕.打印机及其它输出

SQL Server 变更数据捕获(CDC)

原文:SQL Server 变更数据捕获(CDC) 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/字段/对象更改 概述 变更数据捕获用于捕获应用到 SQL Server 表中的插入.更新和删除活动,并以易于使用的关系格式提供这些变更的详细信息.变更数据捕获所使用的更改表中包含镜像所跟踪源表列结构的列,同时还包含了解所发生的变更所需的元数据. 对表开启了变更捕获之后,对该表的所有DML和DDL操作都会被记录,有助于跟踪表的变化. 测试环境: SQL SERVER 2008