CFont
类
封装一个 Windows 图形设备接口 (GDI) 字体并提供用于操作字体的成员函数。
语法
class CFont : public CGdiObject
成员
公共构造函数
名称 | 描述 |
---|---|
CFont::CFont |
构造 CFont 对象。 |
公共方法
名称 | 描述 |
---|---|
CFont::CreateFont |
使用指定的特征初始化 CFont 。 |
CFont::CreateFontIndirect |
使用 LOGFONT 结构中给定的特征初始化 CFont 对象。 |
CFont::CreatePointFont |
用指定高度(以十分之一磅度量)和字样初始化 CFont 。 |
CFont::CreatePointFontIndirect |
与 CreateFontIndirect 相同,不同的是字体高度是以十分之一磅(而不是逻辑单元)度量的。 |
CFont::FromHandle |
在给定 Windows HFONT 时返回指向 CFont 对象的指针。 |
CFont::GetLogFont |
用附加到 CFont 对象的逻辑字体的相关信息填充 LOGFONT 。 |
公共运算符
“属性” | 描述 |
---|---|
CFont::operator HFONT |
返回附加到 CFont 对象的 Windows GDI 字体句柄。 |
注解
若要使用 CFont
对象,请构造一个 CFont
对象,并使用 CreateFont
、CreateFontIndirect
、CreatePointFont
或 CreatePointFontIndirect
将 Windows 字体附加到该对象,然后使用该对象的成员函数来操作字体。
这些 CreatePointFont
和 CreatePointFontIndirect
函数通常比 CreateFont
或 CreateFontIndirect
更易于使用,因为它们会自动将字体高度从磅值转换为逻辑单元。
有关 CFont
的详细信息,请参阅图形对象。
继承层次结构
CFont
要求
标头:afxwin.h
CFont::CFont
构造 CFont
对象。
CFont();
备注
生成的对象必须用 CreateFont
、CreateFontIndirect
、CreatePointFont
或 CreatePointFontIndirect
初始化后才能使用。
示例
CFont font;
CFont::CreateFont
使用指定的特征初始化 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);
参数
nHeight
指定字体的所需高度(以逻辑单元表示)。 有关说明,请参阅 Windows SDK 中 LOGFONT
结构的 lfHeight
成员。 转换后,nHeight
的绝对值不得超过 16,384 个设备单元。 对于所有高度比较,字体映射器查找不超过请求大小的最大字体,或者查找所有字体超过请求大小时的最小字体。
nWidth
指定字体中字符的平均宽度(以逻辑单元表示)。 如果 nWidth
为 0,则设备的纵横比将与可用字体的数字化纵横比匹配,以查找最接近的匹配项,这由差值的绝对值决定。
nEscapement
指定转义矢量与显示图面 x 轴之间的角度(以 0.1 度单元表示)。 转义矢量是通过直线上第一个字符和最后一个字符的原点的直线。 角度是从 x 轴逆时针方向测量的。 有关详细信息,请参阅 Windows SDK 中 LOGFONT
结构的 lfEscapement
成员。
nOrientation
指定字符基线与 x 轴之间的角度(以 0.1 度单元表示)。 在 y 方向向下的坐标系统中,该角度是从 x 轴逆时针测量的;而在 y 方向向上的坐标系统中,角度是从 x 轴顺时针测量的。
nWeight
指定字体粗细(以每 1000 个墨迹像素表示)。 有关详细信息,请参阅 Windows SDK 中 LOGFONT
结构的 lfWeight
成员。 描述的值是近似值;实际外观取决于字样。 某些字体只有 FW_NORMAL
、FW_REGULAR
和 FW_BOLD
粗细。 如果指定 FW_DONTCARE
,则使用默认粗细。
bItalic
指定字体是否为斜体。
bUnderline
指定字体是否带下划线。
cStrikeOut
指定字体中的字符是否被删除。如果设置为非零值,则指定删除线字体。
nCharSet
指定字体的字符集。有关值列表,请参阅 Windows SDK 中 LOGFONT
结构的 lfCharSet
成员。
OEM 字符集依赖于系统。
系统中可能存在具有其他字符集的字体。 使用具有未知字符集的字体的应用程序不得尝试翻译或解释要使用该字体呈现的字符串。 相反,应将字符串直接传递给输出设备驱动程序。
字体映射器不使用 DEFAULT_CHARSET
值。 应用程序可以使用该值来允许字体的名称和大小完全描述逻辑字体。 如果具有指定名称的字体不存在,则任何字符集中的字体都可以替换指定的字体。 为了避免意外结果,应用程序应谨慎使用 DEFAULT_CHARSET
值。
nOutPrecision
指定所需的输出精度。 输出精度定义输出与所请求字体的高度、宽度、字符方向、转义和间距的必需匹配程度。 有关值列表和详细信息,请参阅 Windows SDK 中 LOGFONT
结构的 lfOutPrecision
成员。
nClipPrecision
指定所需的剪裁精度。 剪裁精度定义如何剪裁部分超出剪裁区域的字符。 有关值列表,请参阅 Windows SDK 中 LOGFONT
结构的 lfClipPrecision
成员。
若要使用嵌入的只读字体,应用程序必须指定 CLIP_ENCAPSULATE
。
若要实现设备、TrueType 和矢量字体的一致旋转,应用程序可以使用按位“或”运算符 (|
) 将 CLIP_LH_ANGLES
值与其他任何 nClipPrecision
值组合在一起。 如果设置了 CLIP_LH_ANGLES
位,则所有字体的旋转取决于坐标系统的方向是左侧还是右侧。 (有关坐标系统方向的详细信息,请参阅 nOrientation
参数说明。)如果未设置 CLIP_LH_ANGLES
,则设备字体始终逆时针旋转,但其他字体的旋转取决于坐标系统的方向。
nQuality
指定字体的输出质量,它定义 GDI 必须尝试将逻辑字体属性与实际物理字体的属性进行匹配时的谨慎程度。 有关值列表,请参阅 Windows SDK 中 LOGFONT
结构的 lfQuality
成员。
nPitchAndFamily
指定字体的间距和系列。 有关值列表和详细信息,请参阅 Windows SDK 中 LOGFONT
结构的 lfPitchAndFamily
成员。
lpszFacename
CString
或以 null 结尾的字符串指定字体的字样名称。 此字符串的长度不得超过 30 个字符。 Windows EnumFontFamilies
函数可用于枚举所有当前可用的字体。 如果 lpszFacename
为 NULL
,则 GDI 使用独立于设备的字样。
返回值
如果成功,则不为 0;否则为 0。
注解
随后可以选择字体作为任何设备上下文字体。
CreateFont
函数不会创建新的 Windows GDI 字体。 它只是从 GDI 可用的物理字体中选择最接近的匹配项。
创建逻辑字体时,应用程序可以使用大多数参数的默认设置。 应始终给定特定值的参数是 nHeight
和 lpszFacename
。 如果应用程序未设置 nHeight
和 lpszFacename
,则创建的逻辑字体依赖于设备。
完成 CreateFont
函数创建 CFont
的对象后,使用 CDC::SelectObject
在设备上下文中选择不同的字体,然后删除不再需要的 CFont
对象。
示例
// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.
// Initializes a CFont object with the specified characteristics.
CFont font;
VERIFY(font.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial"))); // lpszFacename
// Do something with the font just created...
CClientDC dc(this);
CFont *def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
font.DeleteObject();
CFont::CreateFontIndirect
使用 LOGFONT
结构中给定的特征初始化 CFont
对象。
BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
参数
lpLogFont
指向定义逻辑字体特征的 LOGFONT
结构。
返回值
如果成功,则不为 0;否则为 0。
备注
随后可以选择字体作为任何设备的当前字体。
此字体具有 LOGFONT
结构中指定的特征。 使用 CDC::SelectObject
成员函数选择字体时,GDI 字体映射器会尝试将逻辑字体与现有物理字体匹配。 如果字体映射器找不到逻辑字体的完全匹配项,则它会提供一种替代字体,其特征与尽可能多的请求特征匹配。
当你不再需要 CreateFontIndirect
函数创建 CFont
的对象时,使用 CDC::SelectObject
在设备上下文中选择不同的字体,然后删除不再需要的 CFont
对象。
示例
// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.
// Initializes a CFont object with the characteristics given
// in a LOGFONT structure.
CFont font;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); // zero out structure
lf.lfHeight = 12; // request a 12-pixel-height font
_tcsncpy_s(lf.lfFaceName, LF_FACESIZE,
_T("Arial"), 7); // request a face name "Arial"
VERIFY(font.CreateFontIndirect(&lf)); // create the font
// Do something with the font just created...
CClientDC dc(this);
CFont *def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
font.DeleteObject();
CFont::CreatePointFont
此函数提供了一种创建指定字样和磅值的字体的简单方法。
BOOL CreatePointFont(
int nPointSize,
LPCTSTR lpszFaceName,
CDC* pDC = NULL);
参数
nPointSize
请求的字体高度(以十分之一磅表示)。 (例如,传递 120 以请求 12 磅字体。)
lpszFaceName
CString
或以 null 结尾的字符串指定字体的字样名称。 此字符串的长度不得超过 30 个字符。 Windows EnumFontFamilies
函数可用于枚举所有当前可用的字体。 如果 lpszFaceName
为 NULL
,则 GDI 使用独立于设备的字样。
pDC
指向要用于将以 nPointSize
表示的高度转换为逻辑单元的 CDC
对象的指针。 如果为 NULL
,则使用屏幕设备上下文进行转换。
返回值
如果成功,则返回非零值;否则返回 0。
备注
它使用 pDC
指向的 CDC 对象自动将以 nPointSize
表示的高度转换为逻辑单元。
完成通过 CreatePointFont
函数创建的 CFont
对象后,首先选择设备上下文中的字体,然后删除 CFont
对象。
示例
// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.
CClientDC dc(this);
CFont font;
VERIFY(font.CreatePointFont(120, _T("Arial"), &dc));
// Do something with the font just created...
CFont *def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
font.DeleteObject();
CFont::CreatePointFontIndirect
此函数与 CreateFontIndirect
相同,只是 LOGFONT
的 lfHeight
成员以十分之一磅(而不是设备单元)说明。
BOOL CreatePointFontIndirect(
const LOGFONT* lpLogFont,
CDC* pDC = NULL);
参数
lpLogFont
指向定义逻辑字体特征的 LOGFONT
结构。 结构 lfHeight
的成员 LOGFONT
以十分之一磅(而不是逻辑单元)进行度量。 (例如,将 lfHeight
设置为 120,以请求 12 磅字体。)
pDC
指向要用于将以 lfHeight
表示的高度转换为逻辑单元的 CDC
对象的指针。 如果为 NULL
,则使用屏幕设备上下文进行转换。
返回值
如果成功,则返回非零值;否则返回 0。
备注
在将 LOGFONT
结构传递到 Windows 之前,此函数使用 pDC
指向的 CDC
对象自动将以 lfHeight
表示的高度转换为逻辑单元。
完成通过 CreatePointFontIndirect
函数创建的 CFont
对象后,首先选择设备上下文中的字体,然后删除 CFont
对象。
示例
// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.
LOGFONT lf;
// clear out structure.
memset(&lf, 0, sizeof(LOGFONT));
// request a 12-pixel-height font
lf.lfHeight = 120;
// request a face name "Arial".
_tcsncpy_s(lf.lfFaceName, LF_FACESIZE, _T("Arial"), 7);
CClientDC dc(this);
CFont font;
VERIFY(font.CreatePointFontIndirect(&lf, &dc));
// Do something with the font just created...
CFont *def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
font.DeleteObject();
CFont::FromHandle
在给定 Windows GDI 字体对象的 HFONT
句柄时返回指向 CFont
对象的指针。
static CFont* PASCAL FromHandle(HFONT hFont);
参数
hFont
Windows 字体的 HFONT
句柄。
返回值
如果成功,则为指向 CFont
对象的指针;否则为 NULL
。
注解
如果 CFont
对象尚未附加到句柄,则会创建并附加一个临时 CFont
对象。 此临时 CFont
对象仅在应用程序下次在其事件循环中有空闲时间之前有效,届时将删除所有临时图形对象。 另一种说法是,临时对象仅在处理窗口消息期间有效。
示例
// The code fragment shows how to create a font object using
// Windows API CreateFontIndirect(), convert the HFONT to a
// CFont* before selecting the font object into a DC (device
// context) for text drawing, and finally delete the font object.
// Initialize a CFont object with the characteristics given
// in a LOGFONT structure.
LOGFONT lf;
// clear out structure
memset(&lf, 0, sizeof(LOGFONT));
// request a 12-pixel-height font
lf.lfHeight = 12;
// request a face name "Arial"
_tcsncpy_s(lf.lfFaceName, LF_FACESIZE, _T("Arial"), 7);
// create the font
HFONT hfont = ::CreateFontIndirect(&lf);
// Convert the HFONT to CFont*.
CFont *pfont = CFont::FromHandle(hfont);
// Do something with the font just created...
CClientDC dc(this);
CFont *def_font = dc.SelectObject(pfont);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
::DeleteObject(hfont);
CFont::GetLogFont
调用此函数可检索 CFont
的 LOGFONT
结构的副本。
int GetLogFont(LOGFONT* pLogFont);
参数
pLogFont
指向用于接收字体信息的 LOGFONT
结构的指针。
返回值
如果函数成功,则返回非零值;否则返回 0。
示例
// The code fragment shows how to retrieve a copy of the
// LOGFONT structure for a currently selected font of a window.
CFont *pFont = pWnd->GetFont();
if (NULL != pFont)
{
LOGFONT lf;
pFont->GetLogFont(&lf);
TRACE(_T("Typeface name of font = %s\n"), lf.lfFaceName);
}
CFont::operator HFONT
使用此运算符获取附加到 CFont
对象的字体的 Windows GDI 句柄。
operator HFONT() const;
返回值
如果成功,则返回附加到 CFont
的 Windows GDI 字体对象的句柄;否则返回 NULL
。
备注
由于此运算符自动用于从 CFont
到字体和文本的转换,因此可以将 CFont
对象传递给需要 HFONT
的函数。
有关使用图形对象的详细信息,请参阅 Windows SDK 中的图形对象。
示例
// The code fragment shows the usage of CFont::operator HFONT.
// Initialize a CFont object with the characteristics given
// in a LOGFONT structure.
LOGFONT lf;
// clear out structure
memset(&lf, 0, sizeof(LOGFONT));
// request a 12-pixel-height font
lf.lfHeight = 12;
// request a face name "Arial"
_tcsncpy_s(lf.lfFaceName, LF_FACESIZE, _T("Arial"), 7);
CFont font1;
font1.CreateFontIndirect(&lf); // create the font
// CFont::operator HFONT automatically converts font1 from
// CFont* to HFONT.
CFont *font2 = CFont::FromHandle(font1);
// Do something with the font just created...
CClientDC dc(this);
CFont *def_font = dc.SelectObject(font2);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);
// Done with the font. Delete the font object.
font1.DeleteObject();