09GDI编程2—文字、位图与图标

  • 格式:doc
  • 大小:6.27 MB
  • 文档页数:55

1 第9章 GDI编程2—文字、位图与图标

与DOS等传统字符界面用点阵模板显示文字不同,GUI中的文字一般是利用轮廓字体中的控制点数据经计算后再绘制出来的。Windows中的文字,采用的是基于二次贝塞尔曲线的TrueType轮廓字体(字体文件为*.TTF)。MFC中的字体类为CFont,在字体对象选入DC后,可用TextOut等函数进行文字的绘制输出。

位图是指由像素阵列组成的数字化点阵图像,是GUI的基本元素。位图可分成与设备相关和无关的两类,分别用于图像的显示和存储,对应的MFC类分别为CBitmap和CImage。

图标是一类大小固定的方型小位图,用于代表应用程序或文档子窗口。为了满足不同显示设备和不同使用目的的需要,在一个程序的图标资源中,一般包含多个不同大小和颜色位数的图像。MFC为应用程序提供了默认的图标,可用资源编辑器对其进行修改。

9.1 输出文本

一般使用CDC类的TextOut等函数,采用DC中的当前字体和文本颜色等来输出文本。还可用SetTextAlign函数来设置文本的对齐方式,并分别用SetTextColor和SetBkColor函数来设置文本的前景和背景颜色。

9.1.1 文本输出函数

在CDC类中,封装了多种文本输出函数,它们都是使用当前的字体、文本颜色和背景颜色,在屏幕或打印机上输出文本(绘制文字)。

常用的文本输出函数有基本的TextOut、限定矩形区域的DrawText和可裁减与调字间距之扩展的ExtTextOut,其中最常用的是TextOut函数。

1.TextOut

TextOut的函数原型为:

virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );

BOOL TextOut( int x, int y, const CString& str );

其中,x与y为显示串的左上角坐标,lpszString或str为要显示的文本串,nCount为串lpszString 2 中的字符数。例如:

pDC->TextOut(10, 30, L"Test text");

2.DrawText

DrawText的函数原型为:

virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );

int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );

其中,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数,*lpRect为指定的显示区域,nFormat为显示格式,可取表9-1中值的位或“|”组合。

表9-1 文本显示格式nFormat的常用取值

符号常量 数值 含义

DT_TOP 0 文本顶对齐,必需与DT_SINGLELINE.同时使用

DT_LEFT 0 居左显示文本

DT_CENTER 1 水平居中显示文本

DT_RIGHT 2 居右显示文本

DT_VCENTER 4 垂直居中显示文本

DT_BOTTOM 8 文本底对齐,必需与DT_SINGLELINE.同时使用

DT_WORDBREAK 0x10 文本行超过矩形区域的宽时换行

DT_SINGLELINE 0x20 单行显示文本,忽略回车和换行符

DT_EXPANDTABS 0x40 扩展Tab字符(默认为8个字符宽)

DT_TABSTOP 0x80 设置Tab的字符位数,该数放在nFormat的高位字节中

DT_NOCLIP 0x100 不剪裁(可提高显示速度)

DT_EXTERNALLEADING 0x200 在行高中包含字体的扩展头(通常不包含)

DT_CALCRECT 0x400 计算并调整矩形的宽与高

DT_NOPREFIX 0x800 终止对表示加下划线的前缀字符&的处理

DT_INTERNAL 0x1000 使用系统字体计算文本规格 3 3.ExtTextOut

ExtTextOut的函数原型为:

virtual BOOL ExtTextOut( int x, int y, UINT nOptions, LPCRECT lpRect,

LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths );

BOOL ExtTextOut( int x, int y, UINT nOptions, LPCRECT lpRect,

const CString& str, LPINT lpDxWidths );

其中,nOptions可为ETO_CLIPPED(裁剪)/ ETO_OPAQUE(不透明),lpRect为裁剪矩形(可为NULL),lpDxWidths指定字符的间距(为NULL时使用默认间距)。

9.1.2 设置文本对齐

可用CDC类的SetTextAlign函数来设置TextOut和ExtTextOut输出文本时的对齐方式:

UINT SetTextAlign( UINT nFlags );

其中,nFlags可为表9-2中值的位或“|”组合,默认的文本对齐方式为“左顶”即“TA_LEFT

| TA_TOP”。

表9-2 文本对齐标志nFlags的取值

符号常量 数值 含义 符号常量 数值 含义

TA_TOP 0 顶对齐(默认值) TA_LEFT 0 居左显示文本(默认值)

TA_BOTTOM 8 底对齐 TA_RIGHT 2 居右显示文本

TA_BASELINE 24 基线对齐 TA_CENTER 6 居中显示文本

TA_UPDATECP 1 更新当前位置 TA_NOUPDATECP 0 不更新当前位置

TA_RTLREADING 256 从右到左(中东) TA_MASK 287 基线+居中+更新+右到左

例如(输出如图9-1):

RECT rect;

GetClientRect(&rect);

int w = rect.right, h = rect.bottom;

pDC->TextOut(10, 10, L"这是左上角"); // 默认为“TA_LEFT | TA_TOP”

pDC->SetTextAlign(TA_CENTER);

pDC->TextOut(w / 2, 10, L"这是顶部中央"); 4 pDC->SetTextAlign(TA_RIGHT);

pDC->TextOut(w - 10, 10, L"这是右上角");

pDC->SetTextAlign(TA_BOTTOM);

pDC->TextOut(10, h - 10, L"这是左下角");

pDC->SetTextAlign(TA_BOTTOM | TA_RIGHT);

pDC->TextOut(w - 10, h - 10, L"这是右下角");

图9-1 文本对齐例的输出

9.1.3 设置文本颜色

在8.3.5小节中已经讲过,可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色(默认的文本前景色为黑色、背景色为白):

virtual COLORREF SetTextColor( COLORREF crColor );

virtual COLORREF SetBkColor( COLORREF crColor );

例如:

pDC->SetTextColor(RGB(255, 0, 0));

pDC->SetBkColor(RGB(0, 0, 128));

9.2 字体

为了能用不同的字体和大小来输出文本串,必须使用作为GDI对象的CFont类。Windows和常用的字处理软件(如Word)与绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType类型的轮廓字体。

9.2.1 CFont类

CFont类是CGDIObject的派生类:CObject→CGDIObject→CFont。只有一个默认构造 5 函数CFont( ); 必须用字体创建成员函数CreateFont[Indirect]或CreatePointFont [Indirect]来进行初始化。

1.字体创建函数

CFont类的字体创建成员函数的原型有:

BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int

nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE

nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality,

BYTE nPitchAndFamily, LPCTSTR lpszFaceName );

BOOL CreateFontIndirect(const LOGFONT* lpLogFont );

BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL );

BOOL CreatePointFontIndirect( const LOGFONT* lpLogFont, CDC* pDC = NULL );

注意:CFont类的这些逻辑字体创建函数,并不是从无到有创建一个全新的GDI字体,而只是从Windows现有的物理字体库中选择一个与所设置参数最匹配的字体。

在这些字体创建函数中,CreateFont的参数有很多,与下面要讨论的逻辑字体结构LOGFONT中字段相对应。而CreatePointFont函数则提供了一种创建字体的简单方法,一般只需提供前面两个参数——字体的大小和名称:

表9-3 汉字字号与nPointSize值及磅数的对应关系

汉字字号 nPointSize值 磅数 汉字字号 nPointSize值 磅数

初号 420 42 四号 140 14

小初 360 36 小四 120 12

一号 260 26 五号 105 10.5

小一 240 24 小五 90 9

二号 220 22 六号 75 7.5

小二 180 18 小六 65 6.5

三号 160 16 七号 55 5.5

小三 150 15 八号 50 5

 nPointSize为字体大小,以0.1点(像素/墨点/磅数)为单位。汉字的字号与nPointSize值及磅数的对应关系见表9-3和图9-2,图书和文献的正文一般为5号宋体字。另