关闭

HDC,CDC,CWindowDC,CClientDC,CPaintDC基础

725人阅读 评论(0) 收藏 举报

A device context is a structure that defines a set of graphic objectsand their associated attributes, as well as the graphic modes that affect output. Thegraphic objects include a pen for line drawing, a brush for painting and filling, a bitmap for copying or scrolling parts of the screen, a palette for defining the set of available colors, a region for clipping and other operations, and a path for painting and drawing operations. The remainder of this section is divided into the following three areas.

 

Graphic Objects

The pen, brush, bitmap, palette, region, and path associated with a DC are referred to as its graphic objects. The following attributes are associated with each of these objects.

Graphic object

Associated attributes

Bitmap

Size, in bytes; dimensions, in pixels; color-format; compression scheme; and so on.

Brush

Style, color, pattern, and origin.

Palette

Colors and size (or number of colors).

Font

Typeface name, width, height, weight, character set, and so on.

Path

Shape.

Pen

Style, width, and color.

Region

Location and dimensions.

 

When an application creates a DC, the system automatically stores a set of default objects in it (there is no default bitmap or path). An application can examine the attributes of the default objects by calling theGetCurrentObject andGetObject functions. The application can change these defaults by creating a new object and selecting it into the DC. An object is selected into a DC by calling the SelectObject function.

An application can set the current brush color to a specified color value withSetDCBrushColor.

TheGetDCBrushColor function returns the DC brush color. TheSetDCPenColor function sets the pen color to a specified color value. TheGetDCPenColor function returns the DC pen color.

 

Graphic Modes

Windows supports five graphic modes that allow an application to specify how colors are mixed, where output appears, how the output is scaled, and so on. These modes, which are stored in a DC, are described in the following table.

Graphics mode

Description

Background

Defines how background colors are mixed with existing window or screen colors for bitmap and text operations.

Drawing

Defines how foreground colors are mixed with existing window or screen colors for pen, brush, bitmap, and text operations.

Mapping

Defines how graphics output is mapped from logical (or world) space onto the window, screen, or printer paper.

Polygon-fill

Defines how the brush pattern is used to fill the interior of complex regions.

Stretching

Defines how bitmap colors are mixed with existing window or screen colors when the bitmap is compressed (or scaled down).

 

As it does with graphic objects, the system initializes a DC with default graphic modes. An application can retrieve and examine these default modes by calling the following functions.

Graphics mode

Function

Background

GetBkMode

Drawing

GetROP2

Mapping

GetMapMode

Polygon-fill

GetPolyFillMode

Stretching

GetStretchBltMode

 

An application can change the default modes by calling one of the following functions.

Graphics mode

Function

Background

SetBkMode

Drawing

SetROP2

Mapping

SetMapMode

Polygon-fill

SetPolyFillMode

Stretching

SetStretchBltMode

 

Device Context Types

There are four types of DCs: display, printer, memory (or compatible), and information. Each type serves a specific purpose, as described in the following table.

Device context

Description

Display

Supports drawing operations on a video display.

Printer

Supports drawing operations on a printer or plotter.

Memory

Supports drawing operations on a bitmap.

Information

Supports the retrieval of device data.

==========================================================================================

首先说一下什么是DC(设备描述表)
解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉。

在c++ 编程中常会见到HDC,CDC,CClientDC,CPaintDC,CWindowDC这样的类
HDC是DC的句柄,API中的一个类似指针的数据类型.
CDC是MFC的DC的一个类
CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.


CDC及其派生类的继承视图:
CObject
public |------CDC
public |------|------CClientDC
public |------|------CPaintDC
public |------|------CWindowDC
public |------|------CMetaFileDC
(注意: 除CMetaFileDC以外的三个派生类用于图形绘制.)


CDC类定义了一个设备描述表相关的类,其对象提供成员函数操作设备描述表进行工作,如显示器,打印机,以及显示器描述表相关的窗口客户区域。

通过CDC的成员函数可进行一切绘图操作。CDC提供成员函数进行设备描述表的基本操作,使用绘图工具, 选择类型安全的图形设备结构(GDI),以及色彩,调色板。除此之外还提供成员函数获取和设置绘图属性,映射,控制视口,窗体范围,转换坐标,区域操作,裁减,划线以及绘制简单图形(椭圆,多边形等)。成员函数也提供绘制文本,设置字体,打印机换码,滚动, 处理元文件。



其派生类:
1.PaintDC: 封装BeginPaint和EndPaint两个API的调用。
(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。
(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。
(3)CPaintDC也只能用在WM_PAINT消息处理之中。


2.CClientDC(客户区设备上下文): 处理显示器描述表的相关的窗体客户区域。
用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。


3.CWindowDC: 处理显示器描述表相关的整个窗体区域,包括了框架和控 件(子窗体)。
(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。
(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。
(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。


4.CMetaFileDC: 与元文件相关的设备描述表关联。



CDC提供两个函数,GetLayout和SetLayout用于反转设备描述表的布局。用于方便阿拉伯,希伯来的书写文化习惯的设计,以及非欧洲表中的字体布局。

CDC包含两个设备描述表,m_hDC和m_hAttribDC对应于相同的设备,CDC为m_hDC指定所有的输出GDI调用,大多数的GDI属性调用由m_hAttribDC控制。(如,GetTextColor是属性调用,而SetTextColor是一种输出调用。)



下面用一些简单的代码看看如果使用这些类
HDC使用, 每次画线等操作都不MFC封装的类多了个HDC的参数
执行在哪个设备描述表操作
HDC hdc=::GetDC(m_hWnd);//m_hWnd == this->m_hWnd 即当前窗口句柄
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);//必须和GetDC配对
可以看到HDC的使用较麻烦, 而且如果::GetDC和::ReleaseDC不配对的话,会造成错误


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

CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

CWindowDC dc(this);
CWindowDC dc2(GetDesktopWindow());//获得整个桌面的句柄, 一些桌面特效程序使用
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

CPaintDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

可以看到 MFC 的类使用方便很多, 因为它们都在构造函数和析构函数调用了响应的函数进行DC的获取和释放.


下面说下一些细点的知识点
CClientDC,CWindowDC 区别不大, 可以说 CWindowDC包含了CClientDC 就拿记事本来说
CClientDC 就只是白白的我们可以编辑文字的那个区域是 客户区
CWindowDC 除了上面说的白白区域, 还包括菜单栏和工具栏等

CClientDC和CWindowDC 与 CPaintDC 的区别大点
在DC的获取方面 CClientDC和CWindowDC 使用的是并只能是 GetDC 和 ReleaseDC
CPaintDC 使用的是并只能是 BeginPaint 和 EndPaint

CPaintDC 只能用在响应 WM_PAINT 事件
CClientDC,CWindowDC 只能用在响应 非WM_PAINT 事件


关于 WM_PAINT 事件
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生WM_PAINT消息。


系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update Region是否为空等。

 

=========================================================================

CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别-Windows绘图基础知识

分类: VC++ 319人阅读 评论(0) 收藏 举报

一、设备环境(DC)的概念
(1)在Windows中,显示工作是基于设备环境的。所谓设备环境(DC)是一种Windows数据结构,该结构包含应用程序设备输
出时所需要的信息。
(2)在使用任何绘图函数之前必须建立一个设备环境对象。
(3)在Visual C++ 6.0的MFC中提供了设备环境类CDC,它封装了绘图所需要的所有函数,其中包括了大多数的Windows API中
的GDI函数。
二、几个设备环境类主要特点
1. CDC类
  CDC类是CObject类的派生类,也是所有设备环境类的基类。CDC类定义了一个设备描述对象,并提供了对设备描述对象进行
操作的成员函数以及对与窗口客户区有关的显示区进行操作的成员函数。
 CDC类提供的成员函数可以用于操作设备描述对象、使用绘图工具、选择图形设备界面,以及操作颜色和调色板,还用于取
得和设置绘图属性、映射方式、视图和窗口范围的操作、坐标的转换、区域的使用、剪取、画线以及绘制图形和文字等操作。
2. CPaintDC类
  CPaintDC类是CDC类的一个派生类,该类一般用在响应WM_PAINT消息的函数OnPaint()中。
  WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处
理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客
户区中的图形绘制操作。
3. CClientDC类
  CClientDC类也是CDC类的派生类。它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)
中进行绘图,坐标点(0,0)通常指的是客户区的左上角。它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。
4. CWindowDC类
  CWindowDC类也是CDC类的派生类。其成员函数可以在窗口的客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态
栏)中绘图,坐标点(0,0)是指整个屏幕的左上角。同CClientDC类一样,它的构造函数调用GegDC函数,而析构函数调用
ReleaseDC函数。
5. CMdtaFileDC类
  CMetaFileDC类提供了一个面向Windows图元文件的设备环境,封装了在一个Windows图元文件中绘图的方法。图元文件是一
个与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图形保
存等。
三、几个设备环境类的主要差别
常用设备环境类有CPaintDC、CClientDC、CWindowDC和CMetaFileDC类
1. CWindowDC类与CPaintDC 、CClientDC类的区别
其区别主要有以下两个方面:
(1)用CPaintDC 和CClientDC类的对象绘制图形时,绘制区只能在客户区,而不能在非客户区;而CwindowDC类既可以在窗口
的客户区也可以在非客户区进行图形绘制。
(2)在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角;而在CPaintDC和
CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。
2. CPaintDC类与CClientDC类的区别
CPaintDC类的对象应用在OnPaint函数中,以响应Windows的WM_PAINT消息;而CClientDC类的对象应用在非响应消息WM_PAINT
的情况下。
CPaintDC类响应WM_PAINT消息,并自动完成绘制,这对维护图形的完整性有着重要的作用。CClientDC类可以实时地将图形绘
制到屏幕上,不需要重画;而如果用CPaintDC类的对象完成同样的工作,只能发出消息让屏幕上包含这条直线的区域重画,以
把这条直线绘制到屏幕上。
四、几个设备环境类的使用方法
1. CDC类
因为CDC类不能用窗口对象指针初始化对象,所以,一般不直接定义对象。
2. CPaintDC类
CPaintDC 类一般用在窗口类OnPaint函数中,可采用如下代码定义一个CPaintDC类对象:
CPaintDC dc(this);
以上代码定义了一个CPaintDC类的对象dc,并用当前的窗口对象指针this对对象进行了初始化。CClientDC和CWindowDC类也采
用这样的方法。
3. CClientDC类
可利用以下代码定义一个对象:CClientDC dc(this);
4. CWindowDC 类
利用以下代码创建一个CWindowDC类的对象:CWindowDC dc(this);

五、绘图设备类
1.GDI的概念
Windows为设备环境提供了各种各样的绘图工具,如【画笔】、【画刷】以及【字体】等。在MFC中封装了这些工具,这些类称
为GDI类,它们有一个共同的抽象基类CGdiObject,可以将这些绘图设备类创建的对象选入到设备环境中,完成有关的操作。

2.常用的绘图设备类
在MFC中主要的绘图设备类有:CGdiObject、CPen、CBrush、CFont、CBitmap、CRgn和CPalette等。
(1)CGdiObject类
CGdiObject类派生于CObject类,它是CGdiObject、CPen、CBrush、Cfont和CBitmap等的基类。用户不能直接生成一个
CGdiObject类,而必须在它的某种设备继承类中生成一个CGdiObject类的派生类。
(2)CPen类
CPen类是CGdiObject类的一个派生类,它封装了Windows图形设备接口(GDI)中有关画笔的操作。
(3)CBrush类
(4)Cfont类
(5)CBitmap类
3.常用的绘图设备类对象的创建和将其引入到设备环境中的方法
在选择绘图设备类对象(GDI对象)进行绘图时,一般可按下列步骤进行:
(1)定义一个GDI对象,然后调用相应的函数(如CreatePen、CreateSolidBrush等)创建此GDI对象。
(2)将已构造出的GDI对象利用设备环境类对象的成员函数SelectObject选入到当前环境中,并同时将原来的GDI对象保存起
来。
(3)绘图结束后,恢复当前设备环境中原来的GDI对象。
注意:在Windows系统中包含了一些库存的GDI对象,在第(3)步中可直接利用设备环境类(CDC)的成员函数
SelectStockObject将一个Windows库存的GDI对象选入,系统可自动将原来选入的GDI对象从设备环境中分离出来。

以下扩展内容自行搜索
六、Windows下的坐标映像方式和特点以及如何设置坐标映像方式。
七、几种常见的Windows的坐标映像方式下的坐标转换方法。
八、几种常见的基本图形元素如点、直线、矩形和文字等的绘制方式。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:464478次
    • 积分:5737
    • 等级:
    • 排名:第4672名
    • 原创:67篇
    • 转载:275篇
    • 译文:0篇
    • 评论:34条
    个人简介

    业务范围:

          承接各类图像智能应用(如非接触性测量,产品缺陷检测,OCR识别,产品模式分类,模式定位,一维码、二维码识别,颜色检测等);视频、音频信号处理、分析;视觉领域嵌入式解决方案;

    开发语言:

          C/C++;

    桌面开发平台:

     Windows。

    联系方式:

    QQ 1445270821

    最新评论