You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32应用中如何使用已安装的自定义字体?代码不生效怎么解决

Win32使用自定义字体的问题修复方案

你代码中存在几处明显错误,导致自定义字体无法生效,具体问题和修正方法如下:

问题汇总

  • SelectObject传参错误:你代码中写的SelectObject(hdc, &newFont);是错误写法,newFont本身就是HFONT类型的GDI句柄,不需要取地址,传地址会导致DC无法正确选入你创建的字体,系统会 fallback 到默认字体渲染。
  • WM_SETFONT使用场景错误:该消息仅适用于Windows标准控件(按钮、编辑框、静态文本等),你直接调用TextOut在窗口DC上绘图时,该消息不会生效,必须手动将字体选入DC才会生效。
  • 字符集匹配问题:如果你当前项目配置的是多字节字符集,TEXT宏返回的是char*字符串,直接传给wcscpy_s会导致字体名乱码,自然无法匹配到对应字体。
  • 需验证字体存在:请先打开控制面板-字体,确认Liberation Mono已正确安装,且字体名称拼写完全一致,没有多余空格或拼写错误。

修正后的代码

HDC hdc = GetDC(window);
// 直接使用宽字符字体名,避免字符集不匹配问题
const WCHAR *font_name = L"Liberation Mono";
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(24, GetDeviceCaps(hdc, LOGPIXELSY), 72);
lf.lfWeight = FW_NORMAL;
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
// 直接用宽字符拷贝,避免字符集问题
wcscpy_s(lf.lfFaceName, _countof(lf.lfFaceName), font_name);
HFONT newFont = CreateFontIndirect(&lf);
// 选入字体时直接传HFONT句柄,不需要取地址,同时保存旧字体
HFONT oldFont = (HFONT)SelectObject(hdc, newFont);
char str[256] = "Test";
TextOutA(hdc, 0, 0, str, strlen(str));
// 绘图完成后先恢复旧字体,再删除自定义字体
SelectObject(hdc, oldFont);
DeleteObject(newFont);
ReleaseDC(window, hdc);

额外注意

如果修改后仍然不生效,可以调用GetObject检查CreateFontIndirect返回的字体信息,确认返回的字体名是否是你指定的Liberation Mono,如果不是说明系统没有找到对应字体,优先检查字体安装和名称拼写问题。

内容的提问来源于stack exchange,提问作者user13606245

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:00