2010-06-27 162 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; 
});