《C语言实例教程(PDF格式)》第119章


举系统中的所有字体,我们将第二个参数设置为NULL;第三个参数为 
枚举字体回调函数,这里为EnumFontFamProc,我们将在下面定义该 
回调函数;第四个参数为指向列表框的指针,这个参数将被传递给回 
调函数,由于我们需要将可用的字体添加到列表框中,因此我们可以 
很自然的将指向该列表框指针当前应用程序提供的参数传递给枚举字 
体回调函数。
枚举字体回调函数的原型在程序中被声明为
int WINAPI EnumFontFamProc(const LOGFONTA *lplf;
const TEXTMETRICA *lptm; unsigned long FontType; LPARAM lParam);
…………………………………………………………Page 563……………………………………………………………
l 注意:
l 在随Visual C++ 5。0提供的Platform SDK (即Win32 SDK)中所给 
出的EnumFontFamProc的原型为
l int CALLBACK EnumFontFamProc( ENUMLOGFONT FAR *lpelf; // pointer to logical
font data
l NEWTEXTMETRIC FAR *lpntm; // pointer to physical…font data
l int FontType; // type of font
l LPARAM lParam // address of application…defined data
l );
然而在本程序中使用上面所给的原型将会在编译时导致类型 
不匹配。正确的回调函数的原型应该如代码清单中所给的那 
样。
图9。 7 示例程序FontDemo的运行结果
在本程序中,传递给回调函数的第一个参数lplf为该字体对应的 
LOGFONTA结构,最后一个参数为指向列表框的CListBox指针。第二个 
参数和第三个参数在本程序中没有使用。在本程序中,枚举字体回调 
函数的结构很简单,它只是将字体的字体名和相应的字符集格式化之 
后添加到列表框中。为了使枚举继续进行,回调函数应该返回真值, 
如果回调函数返回了FALSE,则枚举的过程将被终止。
示例程序FontDemo的运行结果如图9。7所示。
…………………………………………………………Page 564……………………………………………………………
在类CDC中定义的字体和文本函数如表所示。
表9。 5 在类CDC中定义的字体和文本函数
成员函数 描述
TextOut 在指定位置以当前选定字体绘制字符串
ExtTextOut 在指定的矩形区域内使用当前选定字体 
绘制字符串
TabbedTextOut 以指定的位置绘制字符串,并按指定的 
制表符位置扩展字符串的制表符
DrawText 在指定的矩形区域内绘制格式化文本
GetTextExtent 使用当前字体中属性设备上下文中计算 
一行文本的宽度和高度
GetOutputTextExtent 在输出设备上下文中计算一字符串的宽 
度和高度
GetTabbedTextExtent 在属性设备上下文中计算一字符串的宽 
度和高度
GetOutputTabbedTextExtent 在输出设备上下文中计算一字符串的宽 
度和高度
GrayString 在指定位置绘制变灰的文本
GetTextAlign 获得文本对齐标志
SetTextAlign 设置文本对齐标志
GetTextFace 将当前字体的字体名拷贝到缓冲区
GetTextMetrics 从属性设备上下文中获得当前字体的度 
量值
GetOutputTextMetrics 从输出设备上下文中获得当前字体的度 
量值
SetTextJustification 在字符串的分隔字符处添加空白
GetTextCharacterExtra 获得字符间空白的当前设置
SetTextCharacterExtra 设置字符间空白的当前设置
GetFontData 从可缩放字体文件中获取字体信息。所 
获取的信息通过指定字体文件中的偏移 
量和返回信息的长度来确定
…………………………………………………………Page 565……………………………………………………………
GetKerningPairs 在选定的设备上下文中获得当前选定字 
体的字距调整字符对
GetOutlineTextMetrics 获得TrueType字体的字体度量信息
GetGlyphOutline 返回当前字体的字符的轮廓曲线或位图
GetCharABCWidths 从当前字体中以逻辑单位返回给定范围 
的连续字符的宽度
GetCharWidth 从当前字体中返回给定范围的连续字符 
的相对宽度
GetOutputCharWidth 从输出设备上下文中的当前字体返回连 
续字符组中若干单个字符的宽度
续表9。5 
成员函数 描述
SetMapperFlags 改变字体映射程序中从逻辑字符到物理字体 
的映射过程中所使用的算法
GetAspectRatioFilter 获得当前纵横比过滤器的设定
在一些应用程序 (如字处理应用程序)中,我们一般需要由用户来指定 
所使用的字体。这时常使用的方法是弹出一个字体对话框,用户通过 
该字体对话框来设置应用程序所使用的字体。MFC类CFontDialog封装 
了标准的Windows字体对话框。在最简单的情况下,我们只需要声明 
一个类的实例对象CFontDialog,然后通过该对象调用类CFongDialog 
的成员函数DoModal,如果该成员函数返回IDOK,则通过成员函数 
GetCurrentFont将用户所选择的字体信息填入一个LOGFONT结构中, 
在下面的过程中即可通过该结构创建CFont对象。在很多情况下,我 
们需要为字体对话框设置一些初始值,一种很简单的方式在其构造函 
数中传递一个指向LOGFONT结构对象的指针。我们可以在创建 
CFontDialog对象之后,调用DoModal成员之前改变其类型为 
CHOOSEFONT的成员结构m_cf的各成员的值来为字体对话框进行初始设 
置。
9。4。4 创建特殊的字体效果
在一般的应用程序中,我们可以使用SetBkMode和SetBkColor来设置 
绘制文本所使用的颜色和模式,但是,这两个函数所设置的效果是很 
有限的。有时候我们可能希望得到一些特殊的文本输出效果。这时我 
…………………………………………………………Page 566……………………………………………………………
们就应该考虑其它特殊的实现方式。使用路径是其中的一种方法。下 
面我们讲述一些使用路径得到的特殊的字体效果。
(1) 空心字
在开始一个路径前,我们先调用CDC类的成员函数BeginPath,然后调 
用一系列的输出函数,在完成绘制之后,我们可以调用CDC类的成员 
函数EndPath。在完成一个路径之后,我们可以调用StrokePath来绘 
制该路径。为了简单起见,我们仅给出应用程序的OnPaint成员函数 
如下:
// 应用程序主窗口的重绘函数
void CMyWnd::OnPaint()

// 获得窗口的客户区设备上下文句柄
CPaintDC dc(this);
// 更改当前字体
LOGFONT lf;
dc。GetCurre
小说推荐
返回首页返回目录