2010-06-27 165 views
2

我正在使用SetWindowPlacement函數來(1)最大化和(2)更改桌面上外部窗口的恢復位置。但是,當我在WinForm窗口上使用此命令時,似乎沒有正確設置恢復位置。 (我測試的WinForm窗口只是一個沒有修改的VS2008 WinForms應用程序。)所以,例如,如果窗口處於(0,0)的恢復狀態,並且我使用SetWindowPlacement來最大化它並將其設置爲將位置恢復到(100,100),然後單擊窗口的恢復按鈕,它將不會恢復到(100,100),而會恢復到(0,0)。實際上,窗口首先恢復到我設置的位置,然後在以編程方式操作之前移回其最後的恢復位置。我很困惑,爲什麼這隻會發生在WinForm窗口 - 每個非WinForm窗口我嘗試這個恢復到我指定的位置SetWindowPlacement使用SetWindowPlacement更改窗口的恢復位置不適用於每個窗口

我知道這並不多,但我想知道這裏有沒有人對此有何看法。謝謝。

回答

4

是的,這是設計。 Form類跟蹤恢復邊界本身,這是必要的,因此它可以在重新創建後正確地重新定位窗口。 Windows窗體通常會重新創建窗口,以便爲只能由CreateWindowEx()指定的屬性實現屬性設置器。像ShowInTaskbar一樣。

私有RestoreWindowBoundsIfNecessary()方法將窗口放回,它將在窗口恢復時運行。從我所知道的情況來看,恢復邊界在窗口被最小化或最大化之前鎖定。如果要在窗口最小/最大化時修改恢復位置,則必須使用MoveWindow將它移動到之後,以便在之後恢復窗口。應該產生一些閃爍。

+0

嗯......非常有趣。是的,我已經嘗試在移動之前先進行恢復,這會產生一些閃爍。是否有任何RestoreWindowBoundsIfNecessary()的文檔可以指向我?我發現自己很少。謝謝! – 2010-06-27 19:33:12

+0

Form類的源代碼可以從Reference Source獲得:http://referencesource.microsoft.com/ – 2010-06-27 19:45:03

+0

非常有幫助。謝謝。 :-) – 2010-06-27 20:50:37

0

我能夠避免任何閃爍,只需在調度程序後面的旋轉中設置窗口的大小和位置即可。然後,正如漢斯如此幫助指出的,RestoreWindowBoundsIfNecessary將在恢復窗口時使用該大小和位置。

Form window = ... 
window.StartPosition = FormStartPosition.Manual 
window.WindowState = savedState; 
if (window.WindowState == FormWindowState.Normal) 
{ 
    window.Location = savedLocation; 
    window.Size = savedSize; 
} 
else 
{ 
    window.BeginInvoke((MethodInvoker)delegate 
    { 
     window.Location = savedLocation; 
     window.Size = savedSize; 
});