2011-10-20 43 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時,不要更改位置和大小數據。

相關問題