再上一篇:15.3 MFC的数组类
上一篇:15.4 鼠标使用实例
主页
下一篇:15.6 CString类
再下一篇:15.7 文本处理
文章列表

15.5 GDI与文本处理

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

本节介绍绘图和处理文本的基本方法。WINDOWS的 GDI(设备图形接口)提供了绘图的基本工具:画点、线、多边形、位图以及文本输出函数。MFC的设备场境类CDC封装了全部绘图函数,使绘制的图形可以显示或打印。

15.5.1 设备场境CDC和绘图工具

一般使用窗口的目的有二个:其一是处理WINDOWS消息,其二是进行绘图。每当必须绘制窗口内容时,要调用视图的OnDraw成员函数。如果窗口是视图的一个子窗口,可以把视图的某些绘制工作交给子窗口处理。窗口绘制都要用到设备场境(Devicec Context)。设备场境有时也称为设备描述表或设备文本,它是WINDOWS应用程序与设备驱动程序(如打印机或显示器)之间的连接桥梁。也可以说,设备场境实际上就是一个输出路径,从WINDOWS 应用程序开始,经过适当的设备驱动程序,最后到达窗口客户区。在应用程序向窗口客户区输出信息前,必须先获得一个设备场境,否则应用程序和相应窗口之间就没有任何通道。在MFC应用程序中,所有的绘制工作必须通过设备场境的对象来实现,它封装了用于绘制线段、图形和文本的WINDOWS API函数。

在MFC类库中,设备场境类的类名为CDC。所有的绘图函数都在类CDC中定义,因此类CDC是所有其他MFC设备场境类的基类,任何类型的设备场境对象都可以调用这些绘图函数。

窗口坐标系统与基于绘图函数所使用的坐标系统是一致的。系统约定,窗口左上角的坐标是原点,坐标系统的逻辑单位一般为像素,x轴方向向右,y轴方向向下。

应用程序在视图窗口输出时,使用两种基本的绘图工具——画笔和画刷。通常,用画笔勾划一个区域或对象的轮廓,然后用画刷对其进行填充。设备场境对象首次创建时便拥有缺省的画笔和画刷。缺省画笔为黑色,宽度为一个像素。缺省画刷将封闭图形的内部填充为白色。要改变当前画笔或画刷时,既可以使用库存画笔和画刷,也可以创建定制的画笔或画刷,然后将其选入设备场境对象。调用CDC类的成员函数SelectStockObject可以选择库存绘图工具,其函数原型为:

virtual CGdiObject * SelectStockObject(int nIndex);

如果该函数调用成功,返回指向CGdiObject对象的指针——实际指向的对象是CPen,CBrush,CFont对象,否则返回0。参数nIndex是库存画笔和画刷代码值,表15-9给出了该参数的取值(宏)。

表15-9 库存画笔和画刷代码表

画笔和画刷的代码值 颜色

BLACK_PEN 黑色画笔

NULL_PEN 空画笔

WHITE_PEN 白色画笔

BLACK_BRUSH 黑色画刷

DKGRAY_BRUSH 深灰色画刷

GRAY_BRUSH 灰色画刷

HOLLOW_BRUSH 透明窗口画刷

LTGRAY_BRUSH 浅灰色画刷

NULL_BRUSH 空画刷

WHITE_BRUSH 白色画刷

应用程序也可根据需求,定制画笔或画刷。在MFC类库中,类CPen封装了GDI的画笔工具,而类CBrush封装了GDI的画刷工具。在定制画笔或画刷对象时,都要调用构造函数来创建画笔或画刷。使用画笔或画刷的步骤如下:

(1)创建类CPen的对象或类CBrush的对象。

(2)调用合适的成员函数初始化画笔或画刷。

(3)将画笔或画刷对象选入当前设备场境对象中,并保存原先画笔或画刷对象的指针。

(4)调用绘图函数绘制图形或使用画刷对封闭区域进行填充。

(5)最后,将第三步中保存的原先画笔或画刷对象选入设备场境对象,以便恢复原先的状态。

可调用Cpen的成员函数CreatePen初始化画笔,其函数原型为:

BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);

其中,参数nPenStyle为所选画笔的样式;参数nWidth指定画笔的宽度,画笔宽度为逻辑单位,对于点或画线的画笔,画笔宽度为一个像素宽;参数crColor用于指定画笔的颜色。

一旦初始化画笔对象后,调用CDC的成员函数SlectObject将画笔选入设备场境对象。对于画笔和画刷,SlectObject的原型为:

CPen * SlectObject(CPen *pPen);

CBrush* SlectObject(CBrush *pBrush);

可以调用CBrush的三个成员函数之一来产生画刷:

BOOL CreateSolidBrush(COLORREF clColor);

BOOL CreateHatchBrush(int nIndex , COLORREF clColor);

BOOL CreatePatternBrush(CbitMap *pBitMap);

第一个函数创建纯色画刷,第二个函数创建阴影画刷(以特定阴影模式填充图形内部),第三个函数创建定制模式去填充图形的内部。其中参数 clColor用于指定画刷的颜色;nIndex用于指定阴影模式,表15-10中给出了其可能的取值;参数pBitMap是指向位图对象的指针,当使用这种画刷填充图形时,图形内部将用位图一个接一个地填充。

表15-10 画刷的代码取值

值(宏名) 画刷填充形式

HS_BDIAGONAL 反斜线

HS_FDIAGONAL 斜线

HS_CROSS 十字线

HS_DIAG CROSS 斜十字线

HS_HORIZONAL 水平线

HS_VERTICAL 垂直线

画刷的使用过程与画笔类似,下述代码说明了如何在绘图过程中使用画刷对象:

CClientDC dc(this);

CBrush NewBrush, *pOldBrush;

NewBrush.CreateSolidBrush(RGB(0,0,255));

pOldBrush = dc.SlectObject(&NewBrush);

…..

dc. SlectObject(pOldBrush);

初始化画刷和画笔时必须指定相应的颜色值。颜色的数据类型是COLORREF,RGB值是一个32位的整数,包含红、绿、蓝三个颜色域,以Red、Green和Blue的形式指定。第一个字节为红颜色域,第二个字节为绿颜色域,第三个字节为蓝颜色域,第四个字节必须为0。每个域指定相应色彩的浓度,浓度值从0到255。三种颜色的相对强度结合起来产生实际的颜色。既可以手工指定RGB值(如0x00FF0000是纯蓝),也可以使用RGB宏来指定。RGB宏的三个参数取值范围为0~255。

15.5.2 绘图函数与绘图模式

所有的绘图函数都要求给出逻辑坐标单位。缺省情况下,图形坐标系统与视图的逻辑坐标系统一致。常用的绘图函数有17种28个。下面仅列举二个:

COLORRFF SetPixel(int x,int y,COLORRFF crColor);

该成员函数设置指定坐标点像素的颜色。

BOOL Ellipse(int x1, int y1,int x2, int y2);

该成员函数使用当前选定的画笔画出一个椭圆或圆,并使用当前画刷填充区域的内部。与椭圆或圆相切的边界矩形由参数(x1,y1)和(x2,y2)指定。

映射模式用于定义逻辑坐标单位与设备坐标间的关系。当前映射模式不影响那些传递设备坐标的函数。WINDOWS提供了八种不同的映射模式,每种映射模式都有特定的用途。在表15-11列举的映射模式中,前二种为非约束映射模式,后六种为约束映射模式。所谓约束是指比例因子固定,应用程序不能改变映射到设备单位的比例。

表15-11 映射模式表

映射模式 含义

MM_ANISOTROPIC 一个逻辑单位映射为一个任意的设备单位,X轴和Y轴可以任意缩放

X轴正方向向右,Y轴正方向向上

MM_ISOTROPIC 一个逻辑单位映射为一个任意的设备单位,X轴和Y轴比例为1:1

X轴正方向向右,Y轴正方向向上

MM_HIENGLISH 一个逻辑单位映射成0.001英寸,X轴正方向向右,Y轴正方向向上MM_HIMETRIC 一个逻辑单位映射成0.01毫米,X轴正方向向右,Y轴正方向向上MM_LONGLISH 一个逻辑单位映射成0.01英寸,X轴正方向向右,Y轴正方向向上MM_LOMETRIC 一个逻辑单位映射成0.1毫米,X轴正方向向右,Y轴正方向向上MM_TEXT 缺省映射模式,一个逻辑单位映射成一个设备像素

X轴正方向向右,Y轴正方向向上

MM_TWIPS 一个逻辑单位映射成打印点的1/20,相当于1/1440英寸

X轴正方向向右,Y轴正方向向上

在每种约束映射模式中,每个逻辑单位映射成预定义的物理单位。例如,MM_TEXT映射模式把一个逻辑单位映射成一个设备像素,MM_HIMETRIC映射模式把一个逻辑单位映射成设备上的0.01毫米。

映射模式MM_ ANISOTROPIC和MM _ ISOTROPIC是非约束模式,它们用两个矩形区域(窗口和视口)推导出比例因子及轴向。其中,窗口用的是逻辑坐标,视口用的是设备坐标,它们都有一个原点,x范围和y范围。WINDOWS把视口的x范围和窗口的x范围的比值作为水平比例因子,把视口的y范围与窗口的y范围的比值作为垂直比例因子。这两个比例因子决定了把逻辑单位映射成像素的比例关系。除了确定比例因子之外,窗口和视口还要确定对象的轴向。WINDOWS总是把窗口原点映射成视口原点,窗口的 x范围映射成视口的x范围,窗口的y范围映射成视口的y范围。

调用CDC的成员函数SetMapMode可以设置当前映射模式,该函数原型为:

virtual int SetMapMode (int nMapMode );

参数nMapMode只能取表15-11中给出的映射模式值(宏)。该函数调用成功时,返回当前映射模式值;否则返回0。

绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合。缺省绘图模式为R2_COPYPEN时, WINDOWS简单地将画笔颜色复制到显示设备上。绘图模式已在前一节中作了介绍。

在画虚线时,用于填充线间空白的颜色取决于当前背景模式和背景颜色。缺省情况下,背景颜色是白色。可以使用CDC的成员函数SetBkColor设置新的背景颜色,该函数有一个用于指定新背景色的COLORREF类型的参数。

使用SetBkColor函数设置当前背景颜色后,若想使其在输出时有效,可以使用CDC的成员函数SetBkMode设置背景模式,以控制显示时的背景颜色。该函数有一个指定背景模式的参数nBkMode,其值为OPAQUE或TRANSPARENT。如果其值为OPAQUE,则显示时背景改变为当前背景颜色。如果值为 TRANSPARENT,则不改变背景颜色。缺省的背景模式为OPAQUE。