【问题标题】:setwindowplacement doesn't work for maximized windowsetwindowplacement 不适用于最大化窗口
【发布时间】:2015-01-29 08:27:42
【问题描述】:

我有一个多显示器设置。当窗口在辅助监视器中最大化时,我在 OnSysCommand() 中将窗口最大化到监视器大小的一半 通过执行以下操作:

MONITORINFO monitorInfo = { sizeof(MONITORINFO) };
GetMonitorInfo(hMonitor, &monitorInfo);
CRect rc = monitorInfo.rcMonitor;
rc.left = rc.left / 2;
SetWindowPos(hWnd, rc.left, rc.right, rc.Width(), rc.Height(),0);

这很好用。

但是,当进程停止并在进程启动后打开窗口时,窗口最大化到完整的监视器大小,尽管窗口放置在进程退出时保存。(WindowPlacement 的标志是 WPF_RESTORETOMAXIMIZED ,showCmd 是 SW_MAXIMIZE)

在 OnShowWindow() 中,使用了 SetWindowPlacement()。

【问题讨论】:

  • 可能rc.left 的值为零,rc.left = rc.left / 2; 之后表示 0/2 = 0。它将是相同的,这就是它不工作的方式。
  • 试试这个它可能会工作rc.right = rc.right / 2; 或者你可以尝试rc.Width()/2setwindowpos 中的rc.Width() 的位置使其减半。
  • rc.left 不为零。当我最大化打开的窗口时,它可以工作。但是当我停止进程并在启动后打开窗口时,窗口最大化以监视大小。我希望窗口显示为显示器大小的一半,因为我在进程关闭期间存储窗口放置并在 OnShowWindow 中执行 setwindowplacement

标签: c++ windows mfc


【解决方案1】:

最大化总是忽略窗口放置结构内的大小。 这完全是设计使然。

窗口放置结构仅保存未最大化/正常窗口的大小。仅保存最大化窗口的左上角。并且这条线在屏幕坐标中以支持多个终端。

所以你得到你想要的,如果你告诉系统恢复窗口最大化。

如果您想限制窗口的最大化,您必须使用不同的方法。可能是 WM_GETMINMAXINFO 会这样做(我不确定它是否也被咨询,当窗口最大化时)。

【讨论】:

  • 当 nId = SC_MAXIMIZE 时,我限制了 OnSysCommand() 中的最大化,而不是 WM_GETMINMAXINFO。我的问题是以最大化状态显示窗口。我还需要在 OnShowWindow 中添加 SetWindowPos 吗?我的用例: 1. 打开一个窗口,最大化它(工作) 2. 重新启动进程 3. 打开窗口(不起作用,因为它在最大化状态下关闭。)
  • 当系统通过 ShowWindow(SW_MAXIMIZE) 最大化窗口时,不会调用 OnSysCommand!所以你必须使用另一种方法!
  • 是的,在 OnShowWindow 中不会调用 OnSysCommand。我想显示已经设置了最大化属性的窗口并限制最大化大小。
  • 我在 OnShowWindow() 中添加了 SetWindowPos,它可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多