.net 使用隐藏标题栏最小化/还原使windows窗体窗口增长

.net 使用隐藏标题栏最小化/还原使windows窗体窗口增长,.net,winforms,pinvoke,.net,Winforms,Pinvoke,在使用SetWindowLongPtr的PInvoke从一个较大的窗口中删除标题(WS_caption)之后,我在Windows窗体中遇到了这个问题。之后,每当窗口被最小化或最大化,然后恢复到正常状态时,它就会增长(通过CaptionHeight+边框) Windows窗体的布局机制似乎在试图补偿它认为仍然存在的标题栏。(如果我以“无”的FormBorderStyle开始,然后添加我想要的内容,即较大的边框,那么最终会出现相反的问题,即窗口会缩小) 我发现另一个人打了我, 但没有公布解决方案 尝

在使用SetWindowLongPtr的PInvoke从一个较大的窗口中删除标题(WS_caption)之后,我在Windows窗体中遇到了这个问题。之后,每当窗口被最小化或最大化,然后恢复到正常状态时,它就会增长(通过CaptionHeight+边框)

Windows窗体的布局机制似乎在试图补偿它认为仍然存在的标题栏。(如果我以“无”的FormBorderStyle开始,然后添加我想要的内容,即较大的边框,那么最终会出现相反的问题,即窗口会缩小)

我发现另一个人打了我, 但没有公布解决方案

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

(我有一个可行的解决方案,我将很快发布,但最终用户可以看到。)

我的解决方案,由Justin Rogers令人敬畏的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调用置于消息pump上;直接从Resize事件处理程序中调用它为时过早 当标题栏不可见时,ResizeEnd事件似乎不会触发。最终用户确实看到了这种增长和收缩,但它是
非常快。

如果您使用Windows窗体的方式进行此操作,效果会很好。将此代码粘贴到表单中:

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

杰出的这更干净;代码更少,没有视觉异常。这并不容易发现。。。。谢谢。有关可能值的列表,请参阅。