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 中指定的值。
价值 | 意义 |
---|---|
|
字体映射器将此值转换为设备单位,并将其与可用字体的单元格高度匹配。 |
|
字体映射器在搜索匹配项时使用默认高度值。 |
|
字体映射器将此值转换为设备单位,并将其绝对值与可用字体的字符高度匹配。 |
对于所有高度比较,字体映射器查找不超过所请求大小的最大字体。
首次使用字体时,会发生此映射。
对于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 函数可用于枚举所有当前可用字体的字样名称。 有关详细信息,请参阅“备注”。
如果 lpszFaceNULL 或空字符串,GDI 将使用与其他指定属性匹配的第一个字体。
返回值
如果函数成功,则返回值是逻辑字体的句柄。
如果函数失败,则返回值 NULL。
言论
不再需要字体时,请调用 DeleteObject 函数将其删除。
为了帮助保护为 Windows 提供字体的供应商的版权,应用程序应始终报告所选字体的确切名称。 由于可用的字体可能因系统而异,因此不要假定所选字体始终与所请求的字体相同。 例如,如果请求名为 Palatino 的字体,但系统上没有此类字体,则字体映射器将替换具有类似属性但名称不同的字体。 始终向用户报告所选字体的名称。
若要在操作系统的不同语言版本上获取适当的字体,请使用 LOGFONT 结构中所需的字体特征调用 EnumFontFamiliesEx,然后使用 createFont 或 CreateFontIndirect检索相应的字样名称并创建字体。
CreateFont、CreateFontIndirect的字体映射器,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 |
另请参阅
EnumFontFamilies