ptMaxSize
的{{1}}和ptMaxPosition
组件的docs说:
对于顶级窗口,此值基于(...)主监视器。
Raymond Chen elaborates:
如果指定的大小大于或等于主监视器的大小,则调整
MINMAXINFO
以包括主监视器和实际监视器之间的大小差异。 (...)但是如果ptMaxSize
没有完全覆盖监视器,则其值将按原样使用。
因此,如果我想填写ptMaxSize
使得窗口最大化为非主要监视器,在具有不同分辨率/方向的主监视器的设置中,填充工作区域,但不重叠任务栏如果碰巧在同一台显示器上......我如何可靠地做到这一点?
ISTM,一旦我获得了监视器的工作区尺寸,窗口就会打开并计算出所需的窗口最大尺寸:
......高度相同。
如果我对其进行编码,我确实得到了所描述的行为...... 除了,如果显示器具有相同的分辨率但方向不同,调整似乎不会得到应用。
这一切似乎令人难以置信的复杂和奇怪。我错过了什么或误解了什么?实际上我应该做一些简单的强大计算吗?
答案 0 :(得分:0)
在您描述的情况下,您应该能够计算出希望窗口最大化的RECT
,并且RECT
应该完全在一个监视器上(您正在谈论监视器的监视器或工作空间范围,并减少RECT
的范围,根据定义,// given the HWND...
HWND hwnd = ...;
// get handles for primary and target monitor
HMONITOR hPrimaryMonitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
HMONITOR hTargetMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
// prep primary and target monitor info structures
MONITORINFO primaryMonitorInfo { sizeof MONITORINFO };
MONITORINFO targetMonitorInfo { sizeof MONITORINFO };
// get primary and target monitor info
GetMonitorInfo(hPrimaryMonitor, &primaryMonitorInfo);
GetMonitorInfo(hTargetMonitor, &targetMonitorInfo);
// calculate your desired maximized RECT in absolute screen coordinates
RECT maximizedRect = ...;
// adjust the MINMAXINFO struct
MINMAXINFO* pMinMaxInfo = (MINMAXINFO)lParam;
pMinMaxInfo->ptMaxPosition = {
primaryMonitorInfo.rcMonitor.left + maximizedRect.left - targetMonitorInfo.rcMonitor.left,
primaryMonitorInfo.rcMonitor.top + maximizedRect.top - targetMonitorInfo.rcMonitor.top,
};
pMinMaxInfo->ptMaxSize = {
maximizedRect.right - maximizedRect.left,
maximizedRect.bottom - maximizedRect.top
};
将完全位于一个监视器上)。在这种情况下,逻辑很容易。
要清楚:如果期望的最大矩形超出目标监视器,则此逻辑将不起作用。不是OP的情况。
state = {edit: false}