VS2019 MFC CreateFontW 创建字体函数详细解读

35 篇文章 8 订阅

CreateFontW 函数 (wingdi.h)

  • 项目
  • 2022/09/28
  • 4 个参与者

反馈

CreateFont 函数创建具有指定特征的逻辑字体。 随后可将逻辑字体选为任何设备的字体。

语法

C++复制

HFONT CreateFontW(
  [in] int     cHeight,
  [in] int     cWidth,
  [in] int     cEscapement,
  [in] int     cOrientation,
  [in] int     cWeight,
  [in] DWORD   bItalic,
  [in] DWORD   bUnderline,
  [in] DWORD   bStrikeOut,
  [in] DWORD   iCharSet,
  [in] DWORD   iOutPrecision,
  [in] DWORD   iClipPrecision,
  [in] DWORD   iQuality,
  [in] DWORD   iPitchAndFamily,
  [in] LPCWSTR pszFaceName
);

参数

[in] cHeight

字体字符单元格或字符的高度(以逻辑单位为单位)。 字符高度值 (也称为 em 高度) 是字符单元格高度值减去内部前导值。 字体映射器按以下方式解释 nHeight 中指定的值。

Value含义

> 0

字体映射器将此值转换为设备单位,并将其与可用字体的单元格高度匹配。

0

字体映射器在搜索匹配项时使用默认高度值。

< 0

字体映射器将此值转换为设备单位,并将其绝对值与可用字体的字符高度匹配。

 

对于所有高度比较,字体映射器查找不超过所请求大小的最大字体。

首次使用字体时,会发生此映射。

对于MM_TEXT映射模式,可以使用以下公式为具有指定点大小的字体指定高度:

C++复制


nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

[in] cWidth

请求字体中字符的平均宽度(以逻辑单位为单位)。 如果此值为零,则字体映射器选择最接近的匹配值。 最近的匹配值是通过比较当前设备的纵横比与可用字体数字化纵横比之间的差异的绝对值来确定的。

[in] cEscapement

转义向量与设备的 x 轴之间的角度(以十分之几度为单位)。 转义向量与文本行的基线并行。

当图形模式设置为GM_ADVANCED时,可以指定字符串的转义角度,而独立于字符串字符的方向角度。

当图形模式设置为GM_COMPATIBLE时, nEscapement 指定转义和方向。 应将 nEscapement 和 nOrientation 设置为相同的值。

[in] cOrientation

每个字符的基线与设备的 x 轴之间的角度(以十分之几度为单位)。

[in] cWeight

0 到 1000 范围内的字体粗细。 例如,400 是正常的,700 是粗体。 如果此值为零,则使用默认权重。

为方便起见,定义了以下值。

重量

FW_DONTCARE

0

FW_THIN

100

FW_EXTRALIGHT

200

FW_ULTRALIGHT

200

FW_LIGHT

300

FW_NORMAL

400

FW_REGULAR

400

FW_MEDIUM

500

FW_SEMIBOLD

600

FW_DEMIBOLD

600

FW_BOLD

700

FW_EXTRABOLD

800

FW_ULTRABOLD

800

FW_HEAVY

900

FW_BLACK

900

[in] bItalic

如果设置为 TRUE,则指定斜体字体。

[in] bUnderline

如果设置为 TRUE,则指定带下划线的字体。

[in] bStrikeOut

如果设置为 TRUE,则为删除线字体。

[in] iCharSet

字符集。 以下值是预定义的:

  • ANSI_CHARSET
  • BALTIC_CHARSET
  • CHINESEBIG5_CHARSET
  • DEFAULT_CHARSET
  • EASTEUROPE_CHARSET
  • GB2312_CHARSET
  • GREEK_CHARSET
  • HANGUL_CHARSET
  • MAC_CHARSET
  • OEM_CHARSET
  • RUSSIAN_CHARSET
  • SHIFTJIS_CHARSET
  • SYMBOL_CHARSET
  • TURKISH_CHARSET
  • VIETNAMESE_CHARSET

Windows 的朝鲜语版本:

  • JOHAB_CHARSET

中东语言版本的 Windows:

  • ARABIC_CHARSET
  • HEBREW_CHARSET

Windows 的泰国语言版本:

  • THAI_CHARSET

OEM_CHARSET值指定依赖于操作系统的字符集。

DEFAULT_CHARSET设置为基于当前系统区域设置的值。 例如,当系统区域设置为英语 (美国) 时,系统会将其设置为ANSI_CHARSET。

操作系统中可能存在具有其他字符集的字体。 如果应用程序使用具有未知字符集的字体,则不应尝试翻译或解释使用该字体呈现的字符串。

若要确保创建字体时的结果一致,请不要指定OEM_CHARSET或DEFAULT_CHARSET。 如果在 lpszFace 参数中指定字面名称,请确保 fdwCharSet 值与 lpszFace 中指定的字样字符集匹配。

[in] iOutPrecision

输出精度。 输出精度定义输出必须与所请求字体的高度、宽度、字符方向、转义、音调、音调和字体类型相匹配。 可以是下列值之一。

含义

OUT_CHARACTER_PRECIS

未使用。

OUT_DEFAULT_PRECIS

默认字体映射器行为。

OUT_DEVICE_PRECIS

当系统包含具有相同名称的多个字体时,指示字体映射器选择设备字体。

OUT_OUTLINE_PRECIS

此值指示字体映射器从 TrueType 和其他基于大纲的字体中进行选择。

OUT_PS_ONLY_PRECIS

指示字体映射器仅从 PostScript 字体中进行选择。 如果系统中未安装 PostScript 字体,则字体映射器将返回到默认行为。

OUT_RASTER_PRECIS

当系统包含具有相同名称的多个字体时,指示字体映射器选择光栅字体。

OUT_STRING_PRECIS

字体映射器不使用此值,但在枚举光栅字体时返回该值。

OUT_STROKE_PRECIS

字体映射器不使用此值,但在枚举 TrueType、其他基于大纲的字体和矢量字体时返回该值。

OUT_TT_ONLY_PRECIS

指示字体映射器仅从 TrueType 字体中进行选择。 如果系统中未安装 TrueType 字体,则字体映射器将返回到默认行为。

OUT_TT_PRECIS

当系统包含具有相同名称的多个字体时,指示字体映射器选择 TrueType 字体。

 

应用程序可以使用OUT_DEVICE_PRECIS、OUT_RASTER_PRECIS、OUT_TT_PRECIS和OUT_PS_ONLY_PRECIS值来控制当操作系统包含多个具有指定名称的字体时字体映射器如何选择字体。 例如,如果操作系统在光栅和 TrueType 窗体中包含名为 Symbol 的字体,则指定OUT_TT_PRECIS强制字体映射器选择 TrueType 版本。 指定OUT_TT_ONLY_PRECIS强制字体映射器选择 TrueType 字体,即使它必须替换另一个名称的 TrueType 字体。

[in] iClipPrecision

剪辑精度。 剪裁精度定义如何剪裁部分超出剪裁区域的字符。 它可以是以下一个或多个值。

Value含义

CLIP_CHARACTER_PRECIS

未使用。

CLIP_DEFAULT_PRECIS

指定默认剪辑行为。

CLIP_DFA_DISABLE

Windows XP SP1:关闭字体的字体关联。 请注意,此标志不能保证在 Windows Server 2003 之后对任何平台产生任何影响。

CLIP_EMBEDDED

必须指定此标志才能使用嵌入的只读字体。

CLIP_LH_ANGLES

使用此值时,所有字体的旋转取决于坐标系的方向是左手还是右手。

如果未使用,设备字体始终逆时针旋转,但其他字体的旋转取决于坐标系的方向。

有关坐标系方向的详细信息,请参阅 nOrientation 参数的说明

CLIP_MASK

未使用。

CLIP_DFA_OVERRIDE

关闭字体的字体关联。 这与CLIP_DFA_DISABLE相同,但在某些情况下可能会出现问题:要使用的建议标志是CLIP_DFA_DISABLE。

CLIP_STROKE_PRECIS

字体映射器不使用,但在枚举光栅、矢量或 TrueType 字体时返回。

为了兼容,枚举字体时始终返回此值。

CLIP_TT_ALWAYS

未使用。

[in] iQuality

输出质量。 输出质量定义 GDI 必须尝试将逻辑字体属性与实际物理字体属性匹配的方式。 可以是下列值之一。

含义

ANTIALIASED_QUALITY

如果字体支持字体且字体大小不小或太大,则字体是反锯齿或平滑的。

CLEARTYPE_QUALITY

如果已设置,则尽可能使用 ClearType 抗锯齿方法) 呈现文本 (。 有关更多信息,请参见备注。

DEFAULT_QUALITY

字体的外观并不重要。

DRAFT_QUALITY

字体的外观比使用PROOF_QUALITY值时重要。 对于 GDI 光栅字体,启用缩放,这意味着可以使用更多字号,但质量可能较低。 如有必要,合成粗体、斜体、下划线和删除线字体。

NONANTIALIASED_QUALITY

字体从不抗锯齿,即字体平滑不完成。

PROOF_QUALITY

字体的字符质量比逻辑字体属性的精确匹配更重要。 对于 GDI 光栅字体,将禁用缩放,并且选择最接近大小的字体。 虽然使用PROOF_QUALITY时,所选字号可能无法精确映射,但字体质量较高,外观没有扭曲。 如有必要,合成粗体、斜体、下划线和删除线字体。

 

如果输出质量DEFAULT_QUALITY、DRAFT_QUALITY或PROOF_QUALITY,则如果SPI_GETFONTSMOOTHING系统参数为 TRUE,则字体将反锯齿。 用户可以从控制面板控制此系统参数。 (控制面板中设置的精确措辞取决于 Windows 版本,但它将是“屏幕字体平滑边缘”的效果的单词。)

[in] iPitchAndFamily

字体的音调和系列。 两个低序位指定字体间距,可以是以下值之一:

  • DEFAULT_PITCH
  • FIXED_PITCH
  • VARIABLE_PITCH

四个高阶位指定字体系列,可以是以下值之一。

Value含义

FF_DECORATIVE

新颖的字体。 例如 Old English。

FF_DONTCARE

使用默认字体。

FF_MODERN

具有常量笔划宽度的字体,带或不带衬线。 Pica、Elite 和 Courier New 是示例。

FF_ROMAN

具有可变笔划宽度和 serifs 的字体。 例如 MS Serif。

FF_SCRIPT

设计为类似于手写的字体。 例如 Script 和 Cursive。

FF_SWISS

具有可变笔划宽度且没有 serifs 的字体。 女士?Sans Serif 是一个示例。

 

应用程序可以使用布尔 OR 运算符将音调常量与系列常量联接,为 fdwPitchAndFamily 参数指定值。

字体系列以一般方式描述字体的外观。 当请求的确切字面不可用时,它们用于指定字体。

[in] pszFaceName

指向指定字体字号的 null 终止字符串的指针。 此字符串的长度不得超过 32 个字符,包括终止 null 字符。 EnumFontFamilies 函数可用于枚举所有当前可用字体的字号名称。 有关详细信息,请参阅“备注”部分。

如果 lpszFace 为 NULL 或空字符串,GDI 将使用与其他指定属性匹配的第一个字体。

返回值

如果函数成功,则返回值是逻辑字体的句柄。

如果函数失败,则返回值为 NULL

注解

不再需要字体时,请调用 DeleteObject 函数将其删除。

为了帮助保护为 Windows 提供字体的供应商的版权,应用程序应始终报告所选字体的确切名称。 由于可用字体可能因系统而异,因此不要假定所选字体始终与所请求的字体相同。 例如,如果请求名为 Palatino 的字体,但系统上没有此类字体,则字体映射器将替换具有类似属性但不同名称的字体。 始终向用户报告所选字体的名称。

若要在 OS 的不同语言版本上获取适当的字体,请在 LOGFONT 结构中调用具有所需字体特征的 EnumFontFamiliesEx,然后使用 CreateFont 或 CreateFontIndirect 检索相应的字号名称并创建字体。

CreateFontCreateFontIndirect 和CreateFontIndirectEx 的字体映射器可识别英语和本地化字号,而不考虑区域设置。

以下情况不支持 ClearType 反锯齿:

  • 在打印机上呈现的文本。
  • 256 种颜色或更少颜色的显示集。
  • 呈现到终端服务器客户端的文本。
  • 字体不是 TrueType 字体,也不是具有 TrueType 轮廓的 OpenType 字体。 例如,以下不支持 ClearType 反锯齿:类型 1 字体、Postscript OpenType 字体(不含 TrueType 轮廓、位图字体、矢量字体和设备字体)。
  • 字体已优化嵌入位图,仅适用于包含嵌入位图的字号。 例如,这通常发生在东亚字体中。

 

示例

C++

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message)
    {
    
    
    case WM_PAINT:
        {
        RECT rect;
        HFONT hFontOriginal, hFont1, hFont2, hFont3;
        hdc = BeginPaint(hWnd, &ps);

            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 48 pixels in height.
            //The width, when set to 0, will cause the font mapper to choose the closest matching value.
            //The font face name will be Impact.
            hFont1 = CreateFont(48,0,0,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, VARIABLE_PITCH,TEXT("Impact"));
            hFontOriginal = (HFONT)SelectObject(hdc, hFont1);
            
            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 100,100,700,200);
            SetTextColor(hdc, RGB(255,0,0));
            DrawText(hdc, TEXT("Drawing Text with Impact"), -1,&rect, DT_NOCLIP);
            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 36 pixels in height.
            //The width, when set to 20, will cause the font mapper to choose a font which, in this case, is stretched.
            //The font face name will be Times New Roman.  This time nEscapement is at -300 tenths of a degree (-30 degrees)
            hFont2 = CreateFont(36,20,-300,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, VARIABLE_PITCH,TEXT("Times New Roman"));
            SelectObject(hdc,hFont2);
            
            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 100, 200, 900, 800);
            SetTextColor(hdc, RGB(0,128,0));
            DrawText(hdc, TEXT("Drawing Text with Times New Roman"), -1,&rect, DT_NOCLIP);
            
            //Logical units are device dependent pixels, so this will create a handle to a logical font that is 36 pixels in height.
            //The width, when set to 10, will cause the font mapper to choose a font which, in this case, is compressed. 
            //The font face name will be Arial. This time nEscapement is at 250 tenths of a degree (25 degrees)
            hFont3 = CreateFont(36,10,250,0,FW_DONTCARE,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("Arial"));
            SelectObject(hdc,hFont3);

            //Sets the coordinates for the rectangle in which the text is to be formatted.
            SetRect(&rect, 500, 200, 1400, 600);
            SetTextColor(hdc, RGB(0,0,255));
            DrawText(hdc, TEXT("Drawing Text with Arial"), -1,&rect, DT_NOCLIP);

            SelectObject(hdc,hFontOriginal);
            DeleteObject(hFont1);
            DeleteObject(hFont2);
            DeleteObject(hFont3);
        
        EndPaint(hWnd, &ps);
        break;
        }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

有关另一个示例,请参阅 “使用菜单”中的“为Menu-Item文本字符串设置字体”。

 备注

wingdi.h 标头将 CreateFont 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非中性编码别名与非非编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅 函数原型的约定

要求

最低受支持的客户端Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器Windows 2000 Server [仅限桌面应用]
目标平台Windows
标头wingdi.h (包括 Windows.h)
LibraryGdi32.lib
DLLGdi32.dll

另请参阅

CreateFontIndirect

CreateFontIndirectEx

DeleteObject

EnumFontFamilies

EnumFontFamiliesEx

EnumFonts

字体和文本函数

字体和文本概述

LOGFONT

SelectObject

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值