【问题标题】:MFC: CMFCMenuBar.SetMenuFont() not changing the font?MFC:CMFCMenuBar.SetMenuFont() 不改变字体?
【发布时间】:2020-10-14 00:57:08
【问题描述】:

将 MFC 应用更改为每显示器 DPI 感知。在WM_DPICHANGED 消息中,我想更改 CMFCMenuBar 的字体以正确缩放。所以我补充说:

  LOGFONT logfont;
  GetGlobalData()->fontRegular.GetLogFont(&logfont);
  logfont.lfHeight=g_DPIHelper.ScaleNonClientMetricsFont(logfont.lfHeight);
  if (!m_wndMenuBar.SetMenuFont(&logfont)) {
    TRACE0("Unable to set menu font\n");
  }

我确认 logfont.lfHeight 在测试用例中从 -11 变为 -17。我确认SetMenuFont() 调用返回成功。然而,菜单栏上显示的CMFCMenuBar 字体与以前的大小相同。我错过了什么?

TIA!!

【问题讨论】:

标签: winapi mfc menubar cmfctoolbar


【解决方案1】:

问题是在WM_DPICHANGED 发送WM_SETTINGCHANGED 之后,MFC 然后调用AFX_GLOBAL_DATA::OnSettingsChange() 调用UpdateFonts() 使用GetNonClientMetrics() 将其重置回错误的大小,因为大小基于何时应用程序已启动。

WM_DPICHANGED 上计算您的比例因子。然后在WM_SETTINGCHANGED 中进行实际字体更改,这允许字体更改大小在您更改屏幕的 DPI 时生效(不确定是否在移动到另一个窗口时调用 WM_SETTINGCHANGED,如果不是,可以在 @ 中完成更改987654329@。这是一种方法:

void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
  CFrameWndEx::OnSettingChange(uFlags, lpszSection);

  LOGFONT logfont;
  GetGlobalData()->fontRegular.GetLogFont(&logfont);
  logfont.lfHeight=g_DPIHelper.Scale(-11);
  if (!m_wndMenuBar.SetMenuFont(&logfont)) {
    TRACE0("Unable to set menu fonts\n");
  }
}

【讨论】:

  • 一个 DC 可以跨越多个显示器,因此除非有规定说它是一致的,否则谈论 DC 的 DPI 是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2021-09-30
  • 2021-05-14
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多