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();
}
在 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();
}