GDI DC通俗解释

转自:http://zhidao.baidu.com/question/113334182.html

在GDI中,DC(Device context)是一个非常重要的概念。

有的书中,将DC翻译为设备描述表(《Windows 程序设计 第五版》作者Charles Petzold),

也有的书将DC翻译为设备上下文。

到底什么是DC?

用现实中的例子来理解可能更容易些。

如果你喜欢画画,你得先准备了画布,画笔,颜料……

画画的环境搭建好了,你就可以画画了。

这个画画的环境,就是DC。

在图形环境下,一切都是画出来的,所以,你要准备好一个DC,才能在屏幕上画画。——写字也是画画。

在画画的环境中,有哪些对象呢?

画布——GDI对象之一:区域

画笔——GDI对象之一:画笔

颜料盒——GDI对象之一:调色板

如果要在画笔上写字的话,写什么样的字体呢?方正字体?徐静蕾字体?——字体也是GDI对象之一。

有的画笔比较粗,专用来刷大面积背景色的,这是刷子——GDI对象之一:刷子

如果你不想画了,只想把别人画好的画,贴到你的画布上,这也是可以的。——GDI对象之一:位图。

所以,这里就有6种GDI对象可以用于DC。

现在开始画画了,你拿起了一只笔。——在Windows环境里,这叫选择了一个画笔对象:使用SelectOBject函数。当然,如果你没带笔也没关系,Windows为你准备了几只画笔,你可以这样申请系统提供的缺省画笔:hPen = GetStockObject(WHITE_PEN);

如果你画着画着,觉得手中的笔用着不爽,可以换一只啊,没关系的。——依旧是SelectObject()换笔。

当然,如果你走出了画室,别完了把你的画笔清除掉,要不画室里全是笔啊,刷子啊,太乱了。——DeleteObject() 
************************************************************************************************************************************
   
   
   
   

一、设备环境(Device Context)(设备上下文)

    设备上下文DC是一个Windows数据结构,它包含了某个设备的绘制属性。通常,绘制调用都是借助于上下文对象,而这些设备上下文对象封装了用于画线、形状、文本等的Windows API。设备上下文是设备无关的,所以它既可以用于绘制屏幕,也可以用于绘制打印机甚至元文件。设备上下文在内存中创建,而内存经常受到扰动,所以它的地址是不固定的。因此,一个设备上下文句柄不是直接指向设备上下文对象,而是指向另外一个跟踪设备上下文地址的指针。

    我个人认为设备上下文相当于画图过程中的画布(画纸),在VC中,这个画布可以是显示器,也可以使打印机,设备上下文决定了画布的属性,而且封装了在画布上画画的方法,比如画线,画点,等等,例如: pDc->LineTo(512,0); //从左下角到右上角的一条红色直线 。我们在VC中画图时,首先要得到这块画布才可以画画,所以要进行获取设备环境。

     1、常见设备上下文及区别:CClientDC,CPaintDC,CWindowDC

CClientDC:(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。只能在客户区绘制图形。

CPaintDC:只能在客户区绘制图形。(1)CPaintDC类是CDC类的一个派生类,注册机该类一般用在响应WM_PAINT消息的函数OnPaint()中。(2)WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。(3)CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

CWindowsDC:(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在窗口的客户区绘制图形。(2)坐标原点是在窗口的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。

     下面介绍一下获得这块画布的方法,即获取设备上下文的方法:

    1http://www.msdncom.com/、通过OnDraw()函数获得CPaintDC:在OnDraw()函数中入口参数CDC *pDC,传入这即操作的设备上下文,这个上下文既是CPaintDC。他是通过OnPaint()构建,并传入OnDraw(),View类如果没有重载OnPaint(),则窗口刷新时自动调用MFC底层代码的OnPaint()函数,从而调用OnDraw()。Software Open Source Code我们就可以通过OnDraw()在客户区进行初始化的绘制。

2http://www.zhongguoxiazai.com/、通过CClientDC,CPaintDC,CWindowDC定义一个DC。

例如:CClientDC dc(this);创建一个dc,在当前对象的客户区。创建一个CWindowDC类的对象:CWindowDC dc(this);

3、通过HDC GetDC(HWND hWnd);hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境,返回值是hdc,即一个DC描述符,入口参数是一个窗口类型的句柄。

例如: pWnd=GetDlgItem(IDC_STATIC_PIC); //IDC_STATIC_PIC是对话框图片空间的一个标识号       pWnd->SetWindowPos(NULL,0,0,512,120,SWP_NOZORDER|SWP_NOMOVE); //调整长宽为(512,120)           pDc=pWnd->GetDC();

二,GDI及GDI函数

    GDI对象就是绘画时用的工具,比如画笔,画刷,字体,位图,调色板。如果绘图的时候,需要先把相应的GDI设备选入设备环境,就是为画图选个画笔,工具。

注意MFC中,GDI和CDC是两个独立的类

你可能感兴趣的:(GDI DC通俗解释)