按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
o lpszFaceName :定义字体名称,为 Cstring 型或指向一个以空终止符结尾的字符串。此
字符串长度不应超过 30 个字符。Windows CE 中的 EnumFontFamilies 函数可用于计算
当前可用字体的总数。如果为 NULL ,则 GDI 使用与设备无关的字体。
o pDC :指向 CDC 对象,将 nPointSize 中的高度转化为逻辑单位。如果为 NULL ,则屏
幕设备环境用于转换。
该函数自动将 nPointSize 中的高度转化为逻辑单位,这是使用由 pDC 指向的 CDC 对象
实现的。当完成用 CreatePointFont 函数创建 CFont 对象后,从设备环境中选择字体,然后删
除 CFont 对象。
4 .CFont::CreatePointFontIndirect()函数
函数提供了一种创建指定字体和点大小的字体对象的间接方法,声明如下:
BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont;CDC*pDC = NULL);
·150 ·
…………………………………………………………Page 160……………………………………………………………
第 6 章 文本和字体类
参数意义如下:
o lpLogFont :指向 LOGFONT 结构,定义逻辑字体特征。LOGFONT 的 lfHeight 成员用
0。1 点计算而不用逻辑单位(如果设置 lfHeight 为 120,则要求 12 点字体)。
o pDC :指向 CDC 对象,用于将 lfHeight 中的高度转化为逻辑单位。如果为 NULL ,屏
幕设备环境用于转换。
此函数与 CreateFontIndirect 相似,但 LOGFONT 的 lfHeight 成员由 0。1 点表示而不是用
设备单位表示。在传递 LOGFONT 结构到 Windows 之前,pDC 指向的 CDC 对象自动使函数
的 lfHeight 中的高度转化为逻辑单位。当完成由 CreatePointFontIndirect 函数创建的 CFont 对
象之后,先选择设备环境字体,然后删去 CFont 对象。
5 .CFont::FromHandle()函数
该静态函数用于从 Windows GDI 的字体句柄得到对应CFont 对象指针的方法,声明如下:
static CFont* PASCAL FromHandle (HFONT hFont);
参数 hFont 代表 Windows 字体中的 HFONT 句柄。
当给定一个 Windows GDI 字体对象的 HFONT 句柄时,返回一个指向 CFont 对象的指针。
如果 CFont 对象还未附加给句柄,将创建一个临时 CFont 对象,此临时 CFont 对象仅在事件
循环中有空闲时才可用,此时临时图形对象被删除,换一种说法就是临时对象仅在一个窗口
消息进程中才可用。
6。3 文本输出过程
在定义了字体句柄、字体及字体颜色以后,就可以把设置的字体输出到相应的设备中。
Windows 应用程序的文本输出过程比较复杂,除了要确定输出内容外,还要管理输出的格式,
由应用程序完成窗口用户区管理,Windows 系统并不参与窗口用户区的管理,这样就加重了
编写应用程序的负担。例如,在用户区内输出文本时,应用程序必须管理换行、后续字符的
位置等输出格式,Windows 系统并东提供管理输出文本格式的函数。
文本的输出过程包括获取字体信息、格式化文本、调用函数输出文本等过程。
1.获取字体信息
应用程序在输出文本之前必须获取当前使用字体的有关信息,如当前使用的字符高度,
以确定输出文本格式和下一行字符的输出位置。
Windows 程序中通常调用函数 GetTextMetrics 获取当前使用的字体信息。调用该函数时,
系统将当前字体的信息拷贝到一个 TEXTMETRICS 结构的变量中。其形式为:
GetTextMetrics(hdc;&tm); //tm 为 TEXTMETRICS 结构
系统定义的 TEXTMETRICS 结构如下:
typedef struct tagTEXTMETRIC {
LONG tmHeight; //字符向度
LONG tmAscent; //字符基线以上高度
LONG tmDescent; //字符基线以下高度
·151 ·
…………………………………………………………Page 161……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
LONG tmInternalLeading; //tmHeight 制订的字符高度顶部的拉件
LONG tmExternalLeading; //行与行之间的间隔
LONG tmAveCharWidth; //平均字符宽度
LONG tmMaxCharWidth; //最大字符宽度
LONG tmWeight; //字符的粗细度
LONG tmOverhang; //合成字体间附加的宽度
LONG tmDigitizedAspectX; //为输出设备设计的 x 轴尺寸
LONG tmDigitizedAspectY; //为输出设备设计的 y 轴尺寸
TCHAR tmFirstChar; //字体中第一个字符值
TCHAR tmLastChar; //字体中最后一个字符值
TCHAR tmDefaultChar; // 替换字体中没有的字符
TCHAR tmBreakChar; //作为分隔符的字符
BYTE tmItalic; //非 0 则表示字体为斜体
BYTE tmUnderlined; //非 0 则表示字体有下划线
BYTE tmStruckOut; //非 0 则表示字符为删除字体
BYTE tmPitchAndFamily; //字体间距和字体族
BYTE tmCharSet; //字符集
} TEXTMETRIC; *PTEXTMETRIC;
调用函数 GetTextMetrics 获取当前字体的 TEXTMETRICS 结构后,即可为其中的成员设
置文本输出格式。
2 .格式化文本
格式化处理一般完成两件事情 :一是在文本行中确定后续文本的坐标,二是在换行时确
定下一行文本的坐标。
(1)确定后续文本坐标
确定后续文本的坐标时,应先获取当前的字符串的宽度,Windows 系统提供了函数
GetTextExtentPoint32 完成这项任务,并把它存储于一个 SIZE 结构中。该函数的原型为:
BOOL GetTextExtentPoint32(
HDC hdc; // DC 句柄
LPCTSTR lpString; // 指定字符串
int cbString; // 字符串中的字符数目
LPSIZE lpSize // 返回字符串宽度及高度的 SIZE 数据结构的地址
);
SIZE 数据结构定义如下:
typedef struct tagSIZE {
LONG cx;
LONG cy;
} SIZE; *PSIZE;
通过计算字符串的起始坐标与字符串宽度之和,即可得到后续文本的起始坐标。例如,
·152 ·
…………………………………………………………Page 162……………………………………………………………
第 6 章 文本和字体类
X 轴起始坐标为 cx0,如果当前字符串的尺寸信息存储在 size 指向的 SIZE 结构中,则后续文
本的起始坐标 cx1 为:
cx1 = cx0 + size。cx;
(2 )确定换行时的文本坐标
通过计算当前行文本字符的高度与行间隔之和,即可得到换行时文本的起始坐标,上述
两个数值可通过获取当前字体的信息得到,如果当前字体的信息存储在 tm 指向的
TEXTMETRICS 结构中,则换行时 Y 轴上文本的起始坐标 cy 为:
cy = tm。tmHeight + tm。tmExternalLeading;
3 .文本输出
Windows 程序设计时用得最多的文本输出函数便是 Textout,其 API 的函数原型如下:
BOOL TextOut(
HDC hdc; // DC 句柄
int nXStart; // 起始点 X 坐标
int nYStart; //起始点 Y 坐标
LPCTSTR lpString; // 输出的字符串
int cbString // 输出的字符串中字符数目
);
通过调用此函数,可以在指定位置输出文本。
6。4 字体和文本输出实例
实例 6…1:字体和文本输出实例。源代码在光盘中“06实例 6…1gundong ”目录下。
本节实现了一个动态字幕的例子 。从本例中读者可以学习到动态地改变文本坐标来实现
实现动态字幕的方法。该示例是基于对话框模式的,通过改变文本的坐标然后进行实时刷新
来显示字幕,屏幕刷新通过定时器来实现 。。
本例的部分核心源代码如下。
CGundongDlg::CGundongDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGundongDlg::IDD; pParent)
{
//{{AFX_DATA_INIT(CGundongDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()…》LoadIcon(IDR_MAINFRAME);
WidthX=200;
minWidth=10;
Heighty=15;
·153 ·
…………………………………………………………Page 16