【发布时间】:2021-10-29 10:33:15
【问题描述】:
我在 Visual Studio 上克隆并调整了 Open-Shell 的一个版本,并使用他们的 makefile 将其编译为安装程序。更具体地说,我想让“所有程序”文本按钮加粗:
为此,我在第 2336 行的 Src/StartMenu/StartMenuDLL/MenuPaint.cpp 中调用了 CreateFont(每次打开开始菜单时都会调用):
CString name = s_MenuMode == MODE_PROGRAMS ? FindTranslation(L"Menu.Back", L"Back") : FindTranslation(L"Menu.AllPrograms", L"All Programs"); // String is 'All Programs' or 'Back', both of which I want bold
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); // Selects the font into the device context for drawing the text
在代码的更下方,调用DrawText 来显示文本。
将项目编译到安装程序中后,我将程序安装在我进行更改的桌面和干净的虚拟机上,它可以工作:
但是,当我在笔记本电脑上运行安装程序时,不会应用对文本的更改。
我测试了CreateFont 和SelectObject,它们都没有在任何机器上返回任何错误。虚拟机和笔记本电脑都运行 Windows 21H1,所以我认为这不是 Windows 版本问题。
我对否则可能导致这种情况的原因有点无能为力。我以前从未玩过 Windows API。有没有我想念的图书馆?提前谢谢!
【问题讨论】:
-
请注意,在处理 WM_CREATE 时不应调用 SelectObject,请在 WM_PAINT 处理程序中执行该操作。 WM_CREATE 甚至没有可用的 DC(除非您调用 GetDC 等)。
-
您的代码不会检查错误。 CreateFont 可能会失败。
-
@IInspectable 确实,在注意到这些功能没有失败后,我删除了错误检查代码。
-
CreateFont取决于每个系统的状态。您不能在一个系统上进行测试,观察结果,然后得出结论认为其他系统上的结果都相同。 -
@IInspectable 这不是我做的。我用错误检查代码编译它并在所有系统中运行它,没有一个失败。后来我得到了它的代码。我确实在帖子中提到过,但可能不清楚。