2011-10-20 42 views
1

我有一个小小的wxWidget应用程序,它可以将一些首选项保存到一个简单的xml文件中。在这些偏好中,我存储了顶级窗口的位置,大小和最大化状态,以便在下次启动时恢复它。如何获得wxWidget窗口的“非最大化”状态

默认情况下,当您最大化一个窗口时,当您再次单击最大化按钮时,您将恢复您的初始(未最大化)位置/大小。但是,当我保存我的偏好时,我能得到的唯一位置和大小就是最大化的。因此,当用户重新启动其应用程序并希望“取消最大化”时,该窗口仍将占据整个屏幕。

在Windows XP上,我做了一个小技巧,在获取位置和大小之前调用SetMaximize(false)。这工作得很好。但是现在我已经在七岁了,这已经不起作用了。看起来SetMaximize(false)是延迟的:当我中断时,它可以工作,但在正常执行期间,我总是以最大化的位置/大小结束,就好像unmaximize操作在另一个线程中完成一样。

所以我试着在我的“SetMaximize(false)”调用后添加一个Sleep(),但我需要使用一个非常高的值来确保它始终有效,而且我不喜欢那样。

所以,我的问题是:有没有办法获得非最大化窗口的位置和大小? (我也试图捕捉调整大小的事件,但它只适用于大小,我需要的位置也...并没有发现任何“窗口移动”事件)

在此先感谢您的帮助!

+0

唉,我的谷歌功能还不够强大:(我已经找到了一种方法来完成这项工作,但它只是Windows。所以我仍然很想知道是否有任何方法可以做到这一点,如果有人对“仅限Windows”解决方案感兴趣,请点击此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633518%28v=vs.85%29.aspx – Citron

回答

0

我做:

wxPoint pos = GetPosition(); 
wxSize size = GetSize(); 

,并与Win7的/ XP和Linux的作品。

+0

谢谢,我知道这些方法,但正如我所解释的,他们没有返回我需要的值:假设我的窗口位于<100, 100>,其大小为<800, 600>现在,我最大化了我的窗口GetPosition和GetSize现在将返回<0, 0>和而我想要的原始位置和大小,所以这不适用于我,因此我的原始问题^^ – Citron

+0

好的抱歉,这并不清楚我... – mspoerr

0

这很容易。

“窗口移动”类是wxMoveEvent,捕获任何移动的事件类型是wxEVT_MOVE。因此,在顶级窗口类中定义一个函数,如下所示:void MyFrame :: OnMove(wxMoveEvent & evt);

绑定它像这样:

绑定(wxEVT_MOVE,& MyFrame :: OnMove,本);

在OnMove函数和OnSize函数中,通过调用成员函数IsMaximized()来检查窗口是否被最大化。当它返回true时,不要更改位置和大小数据。

相关问题