gpt4 book ai didi

c++ - 无法检测 Windows 字体大小何时更改 C++ MFC

转载 作者:可可西里 更新时间:2023-11-01 18:28:55 25 4
gpt4 key购买 nike

我正在尝试确定如何检测用户何时将 Windows 字体大小从普通字体更改为超大字体,通过在 Windows XP 计算机上执行以下步骤来选择字体大小:

  1. 右键单击桌面并选择“属性”。
  2. 单击“外观”选项卡。
  3. 选择字体大小:普通/大字体/超大字体

我的理解是字体大小的变化会导致 DPI 的变化,所以这是我目前尝试过的方法。


我的目标:

我想检测 Windows 字体大小 何时从普通字体更改为大字体或超大字体,并根据字体大小的变化采取一些措施。我假设当 Windows 字体大小发生变化时,DPI 也会发生变化(尤其是当大小为 Extra Large Fonts 时


到目前为止我尝试了什么:

我收到几条消息,包括:WM_SETTINGCHANGE、WM_NCCALCSIZE、WM_NCPAINT 等...但这些消息都不是字体大小更改时所特有的,换句话说,当我收到 WM_SETTINGSCHANGE 消息时,我想知道什么改变了。

理论上,当我定义 OnSettingChange 并且 Windows 调用它时,lpszSection 应该告诉我更改的部分是什么,并且工作正常,但随后我通过调用 SystemParametersInfo 检查给定的部分,并传入操作 SPI_GETNONCLIENTMETRICS,并且我单步执行调试器并确保观察返回的 NONCLIENTMETRICS 中的数据是否有任何字体更改,但没有发生任何更改。

即使这不起作用,我仍然应该能够在设置更改时检查 DPI。我真的不会关心其他细节,每次收到 WM_SETTINGCHANGE 消息时,我只会检查 DPI 并执行我感兴趣的操作,但我也无法获得系统 DPI。

我已尝试通过调用方法 GetSystemMetrics 来获取 DPI,同样适用于每个 DC:

桌面 DC->GetDeviceCaps LOGPIXELSX/LOGPIXELSY窗口 DC->GetDeviceCaps LOGPIXELSX/LOGPIXELSY当前 DC->GetDeviceCaps LOGPIXELSX/LOGPIXELSY

即使我在图形属性窗口中更改 DPI,这些值也不会返回任何不同的值,它们始终显示 96。

有人可以帮我解决这个问题吗?我应该寻找什么?我应该看哪里?

afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
int windowDPI = 0;
int deviceDPI = 0;
int systemDPI = 0;
int desktopDPI = 0;
int dpi_00_X = 0;
int dpi_01_X = 0;
int dpi_02_X = 0;
int dpi_03_X = 0;

CDC* windowDC = CWnd::GetWindowDC(); // try with window DC
HDC desktop = ::GetDC(NULL); // try with desktop DC
CDC* device = CWnd::GetDC(); // try with current DC
HDC hDC = *device; // try with HDC
if( windowDC )
{
windowDPI = windowDC->GetDeviceCaps(LOGPIXELSY);
// always 96 regardless if I change the Font
// Size to Extra Large Fonts or keep it at Normal

dpi_00_X = windowDC->GetDeviceCaps(LOGPIXELSX); // 96
}

if( desktop )
{
desktopDPI = ::GetDeviceCaps(desktop, LOGPIXELSY); // 96
dpi_01_X = ::GetDeviceCaps(desktop, LOGPIXELSX); // 96
}

if( device )
{
deviceDPI = device->GetDeviceCaps(LOGPIXELSY); // 96
dpi_02_X = device->GetDeviceCaps(LOGPIXELSX); // 96
}

systemDPI = ::GetDeviceCaps(hDC, LOGPIXELSY); // 96
dpi_03_X = ::GetDeviceCaps(hDC, LOGPIXELSX); // 96

CWnd::ReleaseDC(device);
CWnd::ReleaseDC(windowDC);
::ReleaseDC(NULL, desktop);
::ReleaseDC(NULL, hDC);

CWnd::OnWinSettingChange(uFlags, lpszSection);
}

DPI 始终返回 96,但当我将字体大小更改为超大字体或将 DPI 更改为 120(从图形属性)时,设置更改会生效。

最佳答案

[重读后编辑] 我几乎肯定更改为“大字体”不会导致 DPI 更改,而是主题设置。您应该能够通过应用“大字体”更改然后打开 DPI 设置所在的高级显示属性来验证,它应该保持在 96dpi。


DPI 更改应该需要重新启动。也许设置没有传播到 GetDeviceCaps 可以检索它的地方?

也许尝试更改不需要重新启动的设置(也许是分辨率),然后看看是否可以检测到更改。如果可以,您的答案可能是在重新启动之前无法检测到 DPI 变化。

关于c++ - 无法检测 Windows 字体大小何时更改 C++ MFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com