原文
WM_DPICHANGED
message
当窗口的 DPI 改变时将收到此消息。DPI 是窗口的缩放比例。有多种情况会导致 DPI 改变,如下表列出:
- 窗口被移动到有不同 DPI 的显示器。
- 窗口所在显示器的 DPI 发生改变。
Sent when the effective dots per inch (dpi) for a window has changed. The DPI is the scale factor for a window. There are multiple events that can cause the DPI to change. The following list indicates the possible causes for the change in DPI.
The window is moved to a new monitor that has a different DPI.
The DPI of the monitor hosting the window changes.
窗口的 DPI 总是为最后一个 WM_DPICHANGED
消息告知的 DPI。……
The current DPI for a window always equals the last DPI sent by WM_DPICHANGED. This is the scale factor that the window should be scaling to for threads that are aware of DPI changes.
#define WM_DPICHANGED 0x02E0
参数
wParam
wParam
的 HIWORD
是这个窗口 Y 方向的新 DPI,LOWORD
是这个窗口 X 方向的新 DPI。典型的值有:96,120,144,192。对于 Windows apps 来说,这两个值总是相同的。
lParam
一个指向 RECT
结构的指针,里面包含了这个窗口在新的 DPI 下的建议大小和位置。最好在处理这条消息时窗口按 lParam
的建议进行大小和位置的调整。
返回值
如果处理了这条消息,应该返回 0。
备注
这条消息只与设置了 PROCESS_PER_MONITOR_DPI_AWARE
的应用或者设置了 DPI_AWARENESS_PER_MONITOR_AWARE
的线程有关。虽然你的不支持 DPI 识别(DPI unaware)或者支持系统 DPI 识别(system DPI aware)的顶层窗口也可能会收到这条消息,但在这种情况下这条消息可以放心地忽略掉。……
你只需要使用 X 和 Y 方向中的一个就可以了,因为它们是相同的。
为了正确处理这条消息,建议按照 lParam
的建议来并且使用 SetWindowPos
函数。如果你不这么做,你的窗口将会小得一批或大得一批。
DPI 的基础值被定义为 USER_DEFAULT_SCREEN_DPI
,值为 96
。……
举个例子:
case WM_DPICHANGED:
{
g_dpi = HIWORD(wParam);
UpdateDpiDependentFontsAndResources();
RECT* const prcNewWindow = (RECT*)lParam;
SetWindowPos(hWnd,
NULL,
prcNewWindow ->left,
prcNewWindow ->top,
prcNewWindow->right - prcNewWindow->left,
prcNewWindow->bottom - prcNewWindow->top,
SWP_NOZORDER | SWP_NOACTIVATE);
break;
}
……
系统需求
Windows 8.1 及以上(仅桌面程序)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)