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 中指定的值。
值 | 含义 |
---|---|
|
字体映射器将此值转换为设备单位,并将其与可用字体的单元格高度进行匹配。 |
|
字体映射器在搜索匹配项时使用默认高度值。 |
|
字体映射器将此值转换为设备单位,并将其绝对值与可用字体的字符高度相匹配。 |
对于所有高度比较,字体映射器查找不超过请求大小的最大字体。
首次使用该字体时会发生此映射。
对于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 为粗体。 如果此值为零,则使用默认权重。
为方便起见,定义了以下值。
[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
- JOHAB_CHARSET
- ARABIC_CHARSET
- HEBREW_CHARSET
- THAI_CHARSET
DEFAULT_CHARSET根据当前系统区域设置设置为值。 例如,当系统区域设置为英语 (美国) 时,它将设置为ANSI_CHARSET。
操作系统中可能存在具有其他字符集的字体。 如果应用程序使用字符集未知的字体,则不应尝试翻译或解释使用该字体呈现的字符串。
为确保创建字体时的结果一致,请勿指定OEM_CHARSET或DEFAULT_CHARSET。 如果在 lpszFace 参数中指定字体名称,请确保 fdwCharSet 值与 lpszFace 中指定的字体的字符集匹配。
[in] iOutPrecision
输出精度。 输出精度定义输出必须与所请求字体的高度、宽度、字符方向、转义、音调、音调和字体类型匹配的程度。 可以是下列值之一。
当操作系统包含多个具有指定名称的字体时,应用程序可以使用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
剪切精度。 剪裁精度定义如何剪裁部分超出剪裁区域的字符。 它可以是下面的一个或多个值。
[in] iQuality
输出质量。 输出质量定义了 GDI 尝试将逻辑字体属性与实际物理字体属性匹配的谨慎程度。 可以是下列值之一。
如果输出质量为DEFAULT_QUALITY、DRAFT_QUALITY或PROOF_QUALITY,则如果SPI_GETFONTSMOOTHING系统参数为 TRUE,则字体将抗锯齿。 用户可以从控制面板控制此系统参数。 (控制面板中设置的精确措辞取决于 Windows 的版本,但“屏幕字体平滑边缘”的效果是文字。)
[in] iPitchAndFamily
字体的音调和系列。 两个低序位指定字体的间距,可以是以下值之一:
- DEFAULT_PITCH
- FIXED_PITCH
- VARIABLE_PITCH
应用程序可以使用布尔 OR 运算符将间距常量与系列常量联接,从而指定 fdwPitchAndFamily 参数的值。
字体系列以一般方式描述字体的外观。 它们用于在请求的确切字样不可用时指定字体。
[in] pszFaceName
指向以 null 结尾的字符串的指针,该字符串指定字体的字样名称。 此字符串的长度不得超过 32 个字符,包括终止 null 字符。 EnumFontFamilies 函数可用于枚举所有当前可用字体的字样名称。 有关详细信息,请参阅“备注”部分。
如果 lpszFace 为 NULL 或空字符串,GDI 将使用与其他指定属性匹配的第一个字体。
返回值
如果函数成功,则返回值是逻辑字体的句柄。
如果函数失败,则返回值为 NULL。
注解
如果不再需要该字体,请调用 DeleteObject 函数将其删除。
为了帮助保护为 Windows 提供字体的供应商的版权,应用程序应始终报告所选字体的确切名称。 由于可用字体可能因系统而异,因此不要假定所选字体始终与请求的字体相同。 例如,如果请求名为 Palatino 的字体,但系统上没有此类字体,则字体映射器将替换具有类似属性但名称不同的字体。 始终向用户报告所选字体的名称。
若要在操作系统的不同语言版本上获取适当的字体,请在 LOGFONT 结构中调用具有所需字体特征的 EnumFontFamiliesEx,然后检索相应的字样名称并使用 CreateFont 或 CreateFontIndirect 创建字体。
CreateFont、CreateFontIndirect 和 CreateFontIndirectEx 的字体映射器可识别英语和本地化的字样名称,而不考虑区域设置。
以下情况不支持 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 |
另请参阅
EnumFontFamilies