CreateFontA 函数 (wingdi.h)

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

语法

HFONT CreateFontA(
  [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] LPCSTR pszFaceName
);

参数

[in] cHeight

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

价值 意义
> 0
字体映射器将此值转换为设备单位,并将其与可用字体的单元格高度匹配。
0
字体映射器在搜索匹配项时使用默认高度值。
< 0
字体映射器将此值转换为设备单位,并将其绝对值与可用字体的字符高度匹配。
 

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

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

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


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

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

价值 意义
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
四个高序位指定字体系列,可以是以下值之一。
价值 意义
FF_DECORATIVE
新颖的字体。 老英语就是一个例子。
FF_DONTCARE
使用默认字体。
FF_MODERN
具有常量笔划宽度的字体,带或不带衬线。 Pica、Elite 和 Courier New 是示例。
FF_ROMAN
具有可变笔划宽度和衬线的字体。 MS Serif 是一个示例。
FF_SCRIPT
设计为类似于手写的字体。 脚本和 Cursive 是示例。
FF_SWISS
具有可变笔划宽度和无衬线的字体。 女士?Sans Serif 是一个示例。
 

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

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

[in] pszFaceName

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

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

返回值

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

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

言论

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

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

若要在操作系统的不同语言版本上获取适当的字体,请使用 LOGFONT 结构中所需的字体特征调用 EnumFontFamiliesEx,然后使用 createFontCreateFontIndirect检索相应的字样名称并创建字体。

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

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

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

例子

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 [仅限桌面应用]
目标平台 窗户
标头 wingdi.h (包括 Windows.h)
Gdi32.lib
DLL Gdi32.dll

另请参阅

CreateFontIndirect

CreateFontIndirectEx

DeleteObject

EnumFontFamilies

EnumFontFamiliesEx

EnumFonts

字体和文本功能

字体和文本概述

LOGFONT

SelectObject