1

将 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菜单栏上显示的字体与以前的大小相同。我错过了什么?

蒂亚!!

4

1 回答 1

0

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

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

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");
  }
}
于 2020-06-23T21:53:07.540 回答