CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别

1.设备环境(DC)的概念。
2.常用的几个设备环境类如CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及它们在使用方法上的区别。
3.GDI的概念及常用的绘图设备类如CGdiObject、CPen、CBrush、Cfont和CBitmap等的对象的创建和将其引入到设备环境中的方法。
4.Windows下的坐标映像方式和特点以及如何设置坐标映像方式。
5.几种常见的Windows的坐标映像方式下的坐标转换方法。
6.几种常见的基本图形元素如点、直线、矩形和文字等的绘制方式。
8.1 设备环境(DC)
   (1)在Windows中,显示工作是基于设备环境的。所谓设备环境(DC)是一种Windows数据结构,该结构包含应用程序设备输出时所需要的信息。
   (2)在使用任何绘图函数之前必须建立一个设备环境对象。
 (3)在Visual C++ 6.0的MFC中提供了设备环境类CDC,它封装了绘图所需要的所有函数,其中包括了大多数的Windows API中的GDI函数。
8.1 设备环境(DC)
8.1.1 设备环境类
1. CDC类
   (1)CDC类是CObject类的派生类,也是所有设备环境类的基类。CDC类定义了一个设备描述对象,并提供了对设备描述对象进行操作的成员函数以及对与窗口客户区有关的显示区进行操作的成员函数。
 (2)CDC类提供的成员函数可以用于操作设备描述对象、使用绘图工具、选择图形设备界面,以及操作颜色和调色板,还用于取得和设置绘图属性、映射方式、视图和窗口范围的操作、坐标的转换、区域的使用、剪取、画线以及绘制图形和文字等操作。

8.1 设备环境(DC)
2. CPaintDC类
(1)CPaintDC类是CDC类的一个派生类,该类一般用在响应WM_PAINT消息的函数OnPaint()中。
(2)WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。
8.1 设备环境(DC)
3. CClientDC类
CClientDC类也是CDC类的派生类。它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角。它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。
4. CWindowDC类
CWindowDC类也是CDC类的派生类。其成员函数可以在窗口的客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态栏)中绘图,坐标点(0,0)是指整个屏幕的左上角。同CClientDC类一样,它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。
8.1 设备环境(DC)
5. CMdtaFileDC类
CMetaFileDC类提供了一个面向Windows图元文件的设备环境,封装了在一个Windows图元文件中绘图的方法。图元文件是一个与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图形保存等。

8.1 设备环境(DC)
8.1.2 几个设备环境类的主要差别
1. CWindowDC类与CPaintDC 、CClientDC类的区别
其区别主要有以下两个方面:
(1)用CPaintDC 和CClientDC类的对象绘制图形时,绘制区只能在客户区,而不能在非客户区;而CwindowDC类既可以在窗口的客户区也可以在非客户区进行图形绘制。
(2)在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角;而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。

8.1 设备环境(DC)
2. CPaintDC类与CClientDC类的区别
CPaintDC类的对象应用在OnPaint函数中,以响应Windows的WM_PAINT消息;而CClientDC类的对象应用在非响应消息WM_PAINT的情况下。
CPaintDC类响应WM_PAINT消息,并自动完成绘制,这对维护图形的完整性有着重要的作用。CClientDC类可以实时地将图形绘制到屏幕上,不需要重画;而如果用CPaintDC类的对象完成同样的工作,只能发出消息让屏幕上包含这条直线的区域重画,以把这条直线绘制到屏幕上。
8.1 设备环境(DC)
8.1.3 设备环境类的使用方法
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);
8.2 绘图设备类
Windows为设备环境提供了各种各样的绘图工具,如【画笔】、【画刷】以及【字体】等。在MFC中封装了这些工具,这些类称为GDI类,它们有一个共同的抽象基类CGdiObject,可以将这些绘图设备类创建的对象选入到设备环境中,完成有关的操作。
在MFC中主要的绘图设备类有:CGdiObject、CPen、CBrush、CFont、CBitmap、CRgn和CPalette等。
 在选择绘图设备类对象(GDI对象)进行绘图时,一般可按下列步骤进行:
(1)定义一个GDI对象,然后调用相应的函数(如CreatePen、CreateSolidBrush等)创建此GDI对象。
(2)将已构造出的GDI对象利用设备环境类对象的成员函数SelectObject选入到当前环境中,并同时将原来的GDI对象保存起来。
(3)绘图结束后,恢复当前设备环境中原来的GDI对象。
注意:在Windows系统中包含了一些库存的GDI对象,在第(3)步中可直接利用设备环境类(CDC)的成员函数SelectStockObject将一个Windows库存的GDI对象选入,系统可自动将原来选入的GDI对象从设备环境中分离出来。

8.2 绘图设备类
8.2.1 CGdiObject类
CGdiObject类派生于CObject类,它是CGdiObject、CPen、CBrush、Cfont和CBitmap等的基类。用户不能直接生成一个CGdiObject类,而必须在它的某种设备继承类中生成一个CGdiObject类的派生类。
8.2.2 CPen类
CPen类是CGdiObject类的一个派生类,它封装了Windows图形设备接口(GDI)中有关画笔的操作。CPen类的定义如下:
class CPen: public CGdiObject
{
DECLARE_DYNAMIC(CPen)
 
public:

8.2 绘图设备类
static CPen* PASCAL FromHandle(HPEN hpen);
// 构造函数
CPen( );
CPen(int nPenStyle, int nWidth,COLORREF crColor);
#ifndef_MAC
CPen(int nPenStyle, int nWidth, const LOGBRUSH * pLogBrush,int nStyleCount=0, const DWORD * lpStyle=NULL);
#endif
BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor);
#ifndef_MAC
BOOL CreatePen(int nPenStyle, int nWidth, const LOGBRUSH * pLogBrush,
   int nStyleCount=0, const DWORD * lpStyle=NULL);
#endif
BOOL CreatePenIndirect(LPLOGPEN lpLogPen);
//其他部分省略
};

你可能感兴趣的:(window)