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 对象,并使用 CreateFontCreateFontIndirectCreatePointFontCreatePointFontIndirect 将 Windows 字体附加到该对象,然后使用该对象的成员函数来操作字体。

这些 CreatePointFontCreatePointFontIndirect 函数通常比 CreateFontCreateFontIndirect 更易于使用,因为它们会自动将字体高度从磅值转换为逻辑单元。

有关 CFont 的详细信息,请参阅图形对象

继承层次结构

CObject

CGdiObject

CFont

要求

标头afxwin.h

CFont::CFont

构造 CFont 对象。

CFont();

备注

生成的对象必须用 CreateFontCreateFontIndirectCreatePointFontCreatePointFontIndirect 初始化后才能使用。

示例

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_NORMALFW_REGULARFW_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 函数可用于枚举所有当前可用的字体。 如果 lpszFacenameNULL,则 GDI 使用独立于设备的字样。

返回值

如果成功,则不为 0;否则为 0。

注解

随后可以选择字体作为任何设备上下文字体。

CreateFont 函数不会创建新的 Windows GDI 字体。 它只是从 GDI 可用的物理字体中选择最接近的匹配项。

创建逻辑字体时,应用程序可以使用大多数参数的默认设置。 应始终给定特定值的参数是 nHeightlpszFacename。 如果应用程序未设置 nHeightlpszFacename,则创建的逻辑字体依赖于设备。

完成 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 函数可用于枚举所有当前可用的字体。 如果 lpszFaceNameNULL,则 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 相同,只是 LOGFONTlfHeight 成员以十分之一磅(而不是设备单元)说明。

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

调用此函数可检索 CFontLOGFONT 结构的副本。

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();

另请参阅

MFC 示例 HIERSVR
CGdiObject
层次结构图