SystemParametersInfo SPI_GETNONCLIENTMETRICS.lfMessageFont 如何使缩放保持一致?

SystemParametersInfo SPI_GETNONCLIENTMETRICS.lfMessageFont how to make consistant for scaling?

在 Win10 1909 上使用 PerMonitor DPI Aware 和 PerMonitorV2 DPI Aware win32 应用程序 运行 我发现使用 DPI 助手的通用字体缩放存在问题。根据应用程序启动时的 DPI 使用 SystemParametersInfo()SPI_GETNONCLIENTMETRICS returns。如果我在 150DPI 时启动应用程序,lfHeight 是 -18,如果我在 96DPI 启动,lfHeight 是 -12,但是当从 96DPI 更改为 150DPI 时调用 WM_DPICHANGED,它仍然是 -12。所以这意味着该值取决于应用程序启动时的 DPI。这会导致通用缩放出现问题,因为如果从 150DPI 开始并移动到 200DPI,它将是 -36 而不是 -24。 expected/true 您是否必须保存启动 DPI 并在确定如何缩放 SystemParametersInfo()

返回的字体时使用它

TIA!!

If I start the app when at 150DPI, the lfHeight is -18, If I start up at 96DPI, the lfHeight is -12, but when WM_DPICHANGED is called on changing from 96DPI to 150DPI, it's still -12.

SystemParametersInfo API is not DPI aware, and should not be used if the calling thread is per-monitor DPI aware. For the DPI-aware version of this API, see SystemParametersInfoForDPI.

SystemParametersInfoForDpi API 给出了我预期的结果你可以这样试试:

case WM_DPICHANGED:
{
    WORD newDpi = HIWORD(wParam);

    NONCLIENTMETRICS info = { 0 };
    info.cbSize = sizeof(info);

    if (!SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0, newDpi))
        err = GetLastError();
}