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
相关产品推荐
相关产品推荐

