【问题标题】:Win32 API: CreateFont/SelectObject not rendering text properly on a different computerWin32 API:CreateFont/SelectObject 无法在另一台计算机上正确呈现文本
【发布时间】: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 来显示文本。

将项目编译到安装程序中后,我将程序安装在我进行更改的桌面和干净的虚拟机上,它可以工作:

但是,当我在笔记本电脑上运行安装程序时,不会应用对文本的更改。

我测试了CreateFontSelectObject,它们都没有在任何机器上返回任何错误。虚拟机和笔记本电脑都运行 Windows 21H1,所以我认为这不是 Windows 版本问题。

我对否则可能导致这种情况的原因有点无能为力。我以前从未玩过 Windows API。有没有我想念的图书馆?提前谢谢!

【问题讨论】:

  • 请注意,在处理 WM_CREATE 时不应调用 SelectObject,请在 WM_PAINT 处理程序中执行该操作。 WM_CREATE 甚至没有可用的 DC(除非您调用 GetDC 等)。
  • 您的代码不会检查错误。 CreateFont 可能会失败。
  • @IInspectable 确实,在注意到这些功能没有失败后,我删除了错误检查代码。
  • CreateFont 取决于每个系统的状态。您不能在一个系统上进行测试,观察结果,然后得出结论认为其他系统上的结果都相同。
  • @IInspectable 这不是我做的。我用错误检查代码编译它并在所有系统中运行它,没有一个失败。后来我得到了它的代码。我确实在帖子中提到过,但可能不清楚。

标签: c++ windows winapi fonts


【解决方案1】:

事实证明,该代码确实可以在我的笔记本电脑上运行。但是,另一个程序正在干扰/覆盖字体设置(在本例中为 WindowBlinds 10)。

我的方法仍然不理想(如Vlad Feinstein 所述),但我希望它有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多