我有一个小的wxWidget应用程序,它可以将一些首选项保存到一个简单的xml文件中。在这些首选项中,我存储了顶级窗口的位置,大小和最大化状态,以便我可以在下次启动时恢复它。
默认情况下,当您最大化窗口时,再次单击最大化按钮时,您将返回初始(非最大化)位置/大小。但是当我保存我的偏好时,我能得到的唯一位置和大小是最大化的。因此,当用户重新启动其应用程序并希望“取消最大化”时,窗口仍将占据整个屏幕。
在Windows XP上,我做了一个小技巧,即在获取位置和大小之前调用SetMaximize(false)。这工作得很好。但是现在我在Seven,这不再适用了。看起来SetMaximize(false)是延迟的:当我中断时,它可以工作,但是在正常执行期间,我总是以最大化的位置/大小结束,就好像unmaximize操作在另一个线程中完成一样。
所以我尝试在我的“SetMaximize(false)”调用之后添加一个Sleep(),但我需要使用一个非常高的值来确保它始终有效,我不喜欢它。
所以,我的问题是:有没有办法获得非最大化窗口的位置和大小? (我也尝试捕捉调整大小事件,但它只适用于大小,我也需要这个位置......并没有找到任何“窗口移动”事件)
提前感谢您的帮助!
答案 0 :(得分:0)
我这样做:
wxPoint pos = GetPosition();
wxSize size = GetSize();
它适用于Win7 / XP和Linux。
答案 1 :(得分:0)
这很容易。
“window-moved”类是wxMoveEvent,用于捕获任何移动的事件类型是wxEVT_MOVE。因此,在顶级窗口类中定义一个函数,
void MyFrame :: OnMove(wxMoveEvent& evt);
如此绑定:
绑定(wxEVT_MOVE,& MyFrame :: OnMove,this);
在OnMove函数和OnSize函数中,通过调用成员函数IsMaximized()来检查窗口是否最大化。当它返回true时,不要改变位置和大小数据。