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

Kir*_*ril 8 c++ winapi mfc font-size system-font

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

  1. 右键单击桌面,然后选择"属性".
  2. 单击"外观"选项卡.
  3. 选择字体大小:正常/大字体/超大字体

我的理解是字体大小的变化会导致DPI的变化,所以这是我到目前为止所尝试的.


我的目标:

我想检测Windows字体大小何时从正常变为大或超大字体,并根据字体大小更改采取一些操作.我假设当Windows字体大小改变时,DPI也会改变(特别是当大小为超大字体时)


到目前为止我尝试过的:

我收到几条消息,包括: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);
}
Run Code Online (Sandbox Code Playgroud)

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

Aid*_*yan 4

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


DPI 更改应该需要重新启动。也许该设置尚未传播到 GetDeviceCaps 可以检索它的位置?

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

  • DPI 设置更改需要注销并登录(从 Windows 7 开始) (2认同)