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 是粗体。 如果此值为零,则使用默认权重。
为方便起见,定义了以下值。
[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_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 的字体,但系统上没有此类字体,则字体映射器将替换具有类似属性但不同名称的字体。 始终向用户报告所选字体的名称。
若要在 OS 的不同语言版本上获取适当的字体,请在 LOGFONT 结构中调用具有所需字体特征的 EnumFontFamiliesEx,然后使用 CreateFont 或 CreateFontIndirect 检索相应的字号名称并创建字体。
CreateFont、CreateFontIndirect 和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) |
Library | Gdi32.lib |
DLL | Gdi32.dll |
另请参阅
EnumFontFamilies