2009-11-12 134 views
2

我使用SetWindowLongPtr PInvoke从大小窗口中删除标题(WS_CAPTION)后,在Windows窗体中出现此问题。之后,无论窗口是最小化还是最大化,然后恢复到正常,它都会增长(通过CaptionHeight +边框)。使用隐藏标题栏最小化/恢复使窗口窗体窗口增长

看来Windows窗体的布局机制试图补偿它认为仍然存在的标题栏。 (如果我从一个FormBorderStyle的None开始,并添加我想要的,即可观的边框,我最终会遇到相反的问题,窗口缩小)。

我发现另外一个人已经击中了this problem on codeplex, 但是没有发布解决方案。

尝试调整自定义处理程序中某个调整大小事件的大小都为时过早,即Windows窗体在Layout,Resize和SizeChanged事件触发后进行调整,并且如果没有Caption栏,ResizeEnd不会触发。在任何情况下,这只是一个解决方法,我想要一种方法来告诉Windows窗体做正确的事情。 想法?

(我有工作,我会很快发布一个解决办法,但它是对最终用户可见。)

回答

1

它工作正常,如果你这样做的Windows窗体的方式。将此代码粘贴到您的表单中:

protected override CreateParams CreateParams { 
    get { 
    CreateParams parms = base.CreateParams; 
    parms.Style &= ~0xC00000; // Turn off WS_CAPTION 
    return parms; 
    } 
} 
+0

非常好!这更清洁;代码少,没有视觉异常。这不是很容易发现....谢谢。 – crpatton 2009-11-16 22:45:21

+0

请参阅[窗口样式](http://msdn.microsoft.com/zh-cn/library/ms632600.aspx)以获取可能的值列表。 – 2012-06-04 00:43:30

0

link text我的解决方案,由贾斯汀·罗杰斯引发真棒Windows窗体消息泵招:

private delegate void VoidMethodInvoker(); 
    public void ShrinkWindow() 
    { 
     int widthAdjust = 2 * SystemInformation.BorderSize.Height; 
     int heightAdjust = SystemInformation.CaptionHeight + 2 * SystemInformation.BorderSize.Height; 
     this.Size = new System.Drawing.Size(Size.Width - widthAdjust, Size.Height - heightAdjust); 
    } 

// Then in the Resize event: 
    case FormWindowState.Normal: 
    { 
      this.BeginInvoke(new VoidMethodInvoker(this.ShrinkWindow)); 

      break; 
    } 

BeginInvoke将ShrinkWindow调用放在消息泵上;直接从Resize事件处理程序中调用它太早 并且当标题栏不可见时,ResizeEnd事件似乎不会触发。最终用户确实看到这种增长和缩小,但它很快就会变成 。