Win32 API CreateFont/SelectObject跨设备文本渲染异常问题咨询
问题描述
我在Visual Studio中克隆并修改了Open-Shell项目,使用项目自带的makefile编译生成安装包,需求是将开始菜单的「All Programs」文本按钮设置为粗体。
实现代码
为了实现该效果,我在每次打开开始菜单都会调用的Src/StartMenu/StartMenuDLL/MenuPaint.cpp文件第2336行调用CreateFont接口,相关代码如下:
CString name = s_MenuMode == MODE_PROGRAMS ? FindTranslation(L"Menu.Back", L"Back") : FindTranslation(L"Menu.AllPrograms", L"All Programs"); // 字符串为"All Programs"或"Back",两处文本都需要设置为粗体 HFONT hFont = CreateFont(32, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, L"Segoe UI"); SelectObject(hdc, hFont); // 将字体选入设备上下文,用于后续文本绘制
代码后续会调用DrawText接口完成文本绘制。
问题现象
编译生成的安装包在开发用桌面、干净的Windows 21H1虚拟机上运行均正常,粗体效果可以正常生效:
但在同样运行Windows 21H1的笔记本上安装后,样式修改未生效。我已经核查过CreateFont、SelectObject在所有设备上调用都没有报错,我此前没有Windows API开发经验,想确认是否是缺少依赖库导致?还有哪些可行的排查方向?
内容的提问来源于stack exchange,提问作者symbolads
相关产品推荐
相关产品推荐

