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 height) 是字符单元格高度值减去内部前导值。 字体映射器按以下方式解释 在 nHeight 中指定的值。

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

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

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

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


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

[in] cWidth

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

[in] cEscapement

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

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

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

[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
新奇字体。 例如 Old English。
FF_DONTCARE
使用默认字体。
FF_MODERN
笔划宽度恒定的字体,带或不带衬线。 例如,Pica、Elite 和 Courier New。
FF_ROMAN
具有可变笔划宽度和衬线的字体。 例如 MS Serif。
FF_SCRIPT
设计为类似于手写的字体。 例如 Script 和 Cursive。
FF_SWISS
笔划宽度可变且不带衬线的字体。 女士?Sans Serif 就是一个例子。
 

应用程序可以使用布尔 OR 运算符将间距常量与系列常量联接,从而指定 fdwPitchAndFamily 参数的值。

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

[in] pszFaceName

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

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

返回值

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

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

注解

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

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

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

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

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

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

示例

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;
}

有关另一个示例,请参阅 Using Menus 中的“设置 Menu-Item 文本字符串的字体”。

注意

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

要求

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

另请参阅

CreateFontIndirect

CreateFontIndirectEx

DeleteObject

EnumFontFamilies

EnumFontFamiliesEx

EnumFonts

字体和文本函数

字体和文本概述

LOGFONT

SelectObject