我正在尝试确定如何检测用户何时将 Windows 字体大小从普通字体更改为特大字体,通过在 Windows XP 机器上执行以下步骤来选择字体大小:
- 右键单击桌面并选择属性。
- 单击外观选项卡。
- 选择字体大小:普通/大字体/超大字体
我的理解是字体大小的变化会导致 DPI 的变化,所以这是我到目前为止所尝试的。
我的目标:
我想检测Windows 字体大小何时从普通字体更改为大字体或超大字体,并根据该字体大小更改采取一些措施。我假设当 Windows Font Size 改变时,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:
Dekstop 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(从图形属性)时,设置更改才会生效。