我一直不知道DC,见过DC名,看过此类文,就不知道:
为什么出现DC?DC有什么用呢?直接到看另一个文章,才知道这个东西?
感谢今天,我也明白了,2013年5月25日特别的日子。
先说下个人认识,DC是一个中介机构,就象拉皮条一样,让不同的人(设备)能认识。
如上图,我们从总体上看一下为什么要有DC。
一、 显示器上显示的窗体或图片,怎么输出到打印机上呢?
显示器上图像是不能直接被打印机“认识的”,怎么办?用一个中间人,这个中间人它既认识显示器,又认识打印机。
于是就好办了。把显示器上图像换算成DC形式保存在内存中,打印机又认识DC,于是又从DC中提出“图像”换算成自己的打印“形式”。
于是,图像就被打印了。所以,不管你是哪个厂家生产的打印机,它都能被打印出来。
二、 同样对不同的显示器,为什么会显示同样的图像呢?一样DC。
再进一步对于显示器不同程序(窗体或图像)来说,因为保护模式的存在,相互并不能直接“通信”,你的图像画到我的窗体上来。各自
有各自的“主权”,是不容侵犯的。怎么办?
DC中间人又出现了,把你的窗体保存到内存的DC中,我的窗体通过DC又能识别或操作。
三、 上面是中间人的作用。中间人DC的内部是什么呢,就是一个数据结构,把图像分门别类的存储在相关的属性或者方法上。
嗯,这是个人理解,看下别人的文章
文章一:
在mfc中经常看到DC(Device Context),还有CDC,HDC等等一些组合,对此有些不明白的,学习后得到以下经验,分享如下:
在计算机中, 一张图像的实质只是数据,很多的0和1的组合. 它只是数据, 至于如何显示它呢, 毫无疑问,
这涉及到硬件设备, 即显示器\打印机等.那么现在的问题是我有表示图像的数据流,如何将这些数据流代表的图像描绘出来,即将这些数据流解释为图像而不是其他的什么东西呢?
对应于不同的数据结构, 微软就搞了一个Device Context, 它能映射到显示设备,即它代表了真正的硬件.将数据流交给电脑屏幕的DeviceContext, 显示的细节交给它了. 但是微软没有提供如此简洁的直觉性操作,在微软看来, 图像的显示是该图像的数据流从一个设备到另一个设备的过程.我们看看这意味着什么? 即我们在做显示图像这么简单的操作时,我们不得不创建一个临时的设备, 将其作为数据流到达目标设备的过渡,在此之前还必须将图像和临时设备进行关联.
1.DC实际上是GDI内部保存的数据结构,DC与特定的显示设备相关,对于一个他的对象,会具体的包涵该对象的内容,显示细节等所有信息,不用用户自己去定义,有一套默认信息,当然可以自己来修改。
2. 必须用这样一个中间结构体来进行中间传输,需要传输的地方就是:计算机-》显示设备。
3.所有的绘图操作的调用都是通过一个设备描述表类型的对象来实现,这个类对象封装了Windows API(Application Programming Interface,应用程序编程接口)函数中关于划线、作图和输入输出文本的的相关操作。设备描述表允许在窗口上进行与设备无关的绘图操作,设备描述表可以用在往屏幕、打印机或者图元文件的绘图操作。
4.由于用于传输的设备,内容不同,又分为几种不同的dc:
(1).CDC:包涵传输数据的设备环境和成员函数,
(2).HDC:HDC是DC的句柄,
(3).pDC:一个指向设备环境的指针,pDC是类指针。
hDC与pDC的区别:
1.通过pDC获得hdc: HDC hdc=pDC->GetSafeHdc();
2.通过hdc获得pDC: CDC *pDC=new CDC; pDC->Attach(hdc);
---------------------------------------------------------------
文章二:
在现实生活中我们要显示一张图像, 是一件很简单的事情. 投射到计算机中, 则要复杂得多, 因为计算机不是现实世界, 但为了真实地反映现实世界, 走更多的弯路是必然的. 在计算机中, 一张图像的实质只是数据, 很多的0和1的组合. 它只是数据, 至于如何显示它呢, 毫无疑问, 这涉及到硬件设备, 即显示器\打印机等. 那么现在的问题是我有表示图像的数据流, 如何将这些数据流代表的图像描绘出来, 即将这些数据流解释为图像而不是其他的什么东西呢?.
如果我们能直接控制硬件, 那么我们可以将这些数据流塞给显示器或打印机, 然后让它们进行解释. 如果真的这么简单就好了, 我可以任意构造一串数据流, 然后命令显示设备进行解释, 至于解释成什么那我们不要管了, 美女或俊男这都不在我们掌握之内, 因为数据流是我们任意构造的吗!
问题是我们不能直接控制, 结果是我们只能间接控制. 对应于数据结构, 微软就搞了一个Device Context, 它能映射到显示设备, 即它代表了真正的硬件. 如果我们能控制好Device Context, 那么我们也就能控制好真正的硬件.比如说, 我们拥有一些数据流, 我们也知道它代表了一张比较好看的图像. 现在想将它显示在电脑屏幕上, 该如何做呢?
直觉思维告诉我们: 将数据流交给电脑屏幕的Device Context, 显示的细节叫给它了. 但是微软没有提供如此简洁的直觉性操作, 在微软看来, 图像的显示是该图像的数据流从一个设备到另一个设备的过程. 我们看看这意味着什么? 即我们在做显示图像这么简单的操作时, 我们不得不创建一个临时的设备, 将其作为数据流到达目标设备的过渡, 在此之前还必须将图像和临时设备进行关联.
HBITMAP hBitmap = LoadBitmap(...);
// 创建临时设备, 即通常说的内存DC, 而这个设备要与目标设备兼容
// "兼容"就是指两个设备在特性上面要吻合, 不能冲突, 说白了就是
// 属性相同.
HDC pCurrentDC = CreateDC(...);
HDC hTmpDC = CreateCompatibleDC(pCurrentDC);
// 将Bitmap和临时设备进行关联, 假设hbitmap已经成功加载
HBITMAP hOldBitmap = reinterpret_cast<HBITMAP>SelectObject(hTmpDC, hBitmap);
// 从临时设备到目标设备, 如果这个目标设备是显示器就是显示图像
BitBlt(hCurrentDC, 0, 0, nWidth, nHeight, &hTmpDC, 0, 0, SRCCOPY);
// 断开临时设备和Bitmap的关联
SelectObject(hTmpDC, hOldBitmap);
// 释放临时设备
ReleaseDC(hTmpDC);
以上代码做解释用, 从中可以看出Device Context最大的特点是SelectObject,
而这个Object是Device Context的属性之一, 同时有时必须的, 为什么这样讲呢?
因为每个Device Context创建后都有一系列默认的属性Object. 选进了新的Object,
操作完了还要将原来的属性Object再设定回去.
Device context
设备上下文(我更喜欢称作 设备相关性)
A device context is a structure that defines a set of graphic objects and their associated attributes, as well as the graphic modes that affect output.
DC是一个包含了一系列图形对象(及属性)和影响图形输出模式的结构。
Unlike most of the structures, an application never has direct access to the DC; instead, it operates on the structure indirectly by calling various functions.
不像其他一些常见的结构,程序从不直接操作DC,而是通过调用各式各样函数来间接进行操作。
现在就明白了,什么是DC了!原来就是那些映象模式和画笔什么的啊。
再来看看Graphic objects究竟含有哪些东西。说实话我真不记得有哪些了。
位图、画刷、调色板、字体、路径、画笔、区域——7种
看起来都理所当然,呵呵。
Device independence
设备无关性
Device independence is one of the chief features of Microsoft? Windows?.
这个特性是MS Windows的主要特性之一
Applications can draw and print output on a variety of devices.
The software that supports this device independence is contained in two dynamic-link libraries.
The first, Gdi.dll, is referred to as the graphics device interface (GDI);
实现设备无关性第一个需要的DLL是GDI.dll
the second is referred to as a device driver.
第二个是设备驱动
The name of the second depends on the device where the application draws output.
For example,
if the application draws output in the client area of its window on a VGA display, this library is Vga.dll;
如果是在VGA显示器上的客户区域里做图形输出的话,就调用的是Vga.dll的设备驱动
if the application prints output on an Epson FX-80 printer, this library is Epson9.dll.
如果是在爱普生的FX-80打印机上,就是调用的Epson9.dll了
An application must inform GDI to load a particular device driver and,
once the driver is loaded, to prepare the device for drawing operations (such as selecting a line color and width, a brush pattern and color, a font typeface, a clipping region, and so on).
程序必须通知GDI调用专属的设备驱动,一旦设备驱动加载完毕,就可以进行作图了。
These tasks are accomplished by creating and maintaining a device context (DC).
通过创建并保存DC就可以实现上述操作。
联系客服