如何获得“非最大化” wxWidget 窗口的状态
我有一个小的 wxWidget 应用程序,它可以将一些首选项保存到一个简单的 xml 文件中。在这些首选项中,我存储了顶级窗口的位置、大小和最大化状态,以便我可以在下次启动时恢复它。
默认情况下,当您最大化窗口时,当您再次单击最大化按钮时,您将恢复初始(非最大化)位置/大小。但是当我保存我的首选项时,我可以获得的唯一位置和大小是最大化的位置和大小。因此,当用户重新启动其应用程序并想要“取消最大化”它时,窗口仍将占据整个屏幕。
在 Windows XP 上,我做了一个小技巧,即在获取位置和大小之前调用 SetMaximize(false)。这工作得很好。但现在我已经到了七号,这不再起作用了。看来 SetMaximize(false) 被推迟了:当我中断时,它可以工作,但在正常执行期间,我总是以最大化位置/大小结束,就好像取消最大化操作是在另一个线程中完成的一样。
因此,我尝试在“SetMaximize(false)”调用之后添加一个 Sleep() ,但我需要使用一个非常高的值来确保它始终正常工作,但我不喜欢这样。
所以,我的问题是:有什么方法可以获取非最大化窗口的位置和大小吗? (我也尝试捕获调整大小事件,但它只适用于大小,而且我也需要位置......并且没有发现任何“窗口移动”事件)
提前感谢您的任何帮助!
I have a little wxWidget application which can save a few preferences into a simple xml file. Amongst those preferences, I store the position, size and maximized state of my top level window so that I can restore it on the next launch.
By default, when you maximize a window, when you click again the maximize button, you get back your initial (non-maximized) position/size. But when I save my preferences, the only position and size I can get are the maximized one. So when the user restart its application, and want to "un-maximize" it, the window will still occupies the whole screen.
On Windows XP, I did a little trick which was to call SetMaximize(false) before getting the position and size. This was working just fine. But now I'm on Seven, and this doesn't work anymore. It seems that the SetMaximize(false) is deferred : when I break, it works, but during a normal execution, I always end-up with the maximized position/size, as if the unmaximize operation is done in another thread.
So I tried to add a Sleep() just after my "SetMaximize(false)" call, but I need to use a really high value to ensure it's always working, and I don't like that.
So, my question is : is there any way to get the position and size of the non-maximized window ? (I also tried to catch resize events, but it only work for the size, and I need the position also ... and didn't found any "window moved" event)
Thanks in advance for any help !
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我这样做的是:
它适用于 Win7/XP 和 Linux。
I do it with:
and it works with Win7/XP and Linux.
这很容易。
“窗口移动”类是wxMoveEvent,用于捕获任何移动的事件类型是wxEVT_MOVE。因此,在顶级窗口类中定义一个函数,
void MyFrame::OnMove(wxMoveEvent& evt );
像这样绑定它:
Bind(wxEVT_MOVE, &MyFrame::OnMove, this);
在 OnMove 函数和 OnSize 函数中,通过调用成员函数 IsMaximized() 检查窗口是否最大化。当它返回 true 时,不要更改位置和大小数据。
It's easy.
The "window-moved" class is wxMoveEvent and the event-type for catching any move is wxEVT_MOVE. So define a function in your top-level window class,
void MyFrame::OnMove(wxMoveEvent& evt );
Bind it like so:
Bind(wxEVT_MOVE, &MyFrame::OnMove, this);
In both the OnMove function and the OnSize function, check to see if the window is maximized by calling the member-function IsMaximized(). When it returns true, do not change the position and size data.