第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。
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中的字符数。例如:
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_BOTTOM | 文本底对齐,必需与DT_SINGLELINE.同时使用 |
DT_CALCRECT | 计算并调整矩形的宽与高 |
DT_CENTER | 水平居中显示文本 |
DT_EXPANDTABS | 扩展Tab字符(默认为8个字符宽) |
DT_LEFT | 10万左右的新能源汽车推荐 居左显示文本 |
DT_NOCLIP | 不剪裁(可提高显示速度) |
好玩的魔兽rpg地图DT_NOPREFIX | 终止对表示加下划线的前缀字符&的处理 |
中学教师个人述职 DT_RIGHT | 居右显示文本 |
参差不齐造句DT_SINGLELINE | 单行显示文本,忽略回车和换行符 |
DT_TABSTOP | 设置Tab的字符位数,该数放在nFormat的高位字节中 |
DT_TOP | 文本顶对齐,必需与DT_SINGLELINE.同时使用 |
DT_VCENTER | 垂直居中显示文本 |
DT_WORDBREAK | 文本行超过矩形区域的宽时换行 |
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_BASELINE | 基线对齐 | TA_NOUPDATE | 不更新当前位置 |
TA_BOTTOM | 底对齐 | TA_RIGHT | 居右显示文本 |
TA_CENTER | 不要骗我居中显示文本 | TA_TOP | 顶对齐(默认值) |
TA_LEFT | 居左显示文本(默认值) | TA_UPDATE | 更新当前位置 |
例如(输出见图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"这是顶部中央");
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。只有一个默认构造函数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 );
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论