使用隐藏标题栏最小化/恢复使窗体窗口窗口增长

时间:2009-11-12 15:59:35

标签: .net winforms pinvoke

在使用SetWindowLongPtr的PInvoke从Sizable窗口中删除标题(WS_CAPTION)之后,我在Windows窗体中遇到了这个问题。之后,只要窗口最小化或最大化然后恢复到正常,它就会增长(通过CaptionHeight +边框)。

似乎Windows Forms的布局机制正在尝试补偿它认为仍然存在的标题栏。 (如果我从一个FormBorderStyle开始并添加我想要的东西,即相当大的边框,我最终遇到了相反的问题,窗口缩小了。)

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

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

(我有一个有效的解决方法,我很快就会发布,但最终用户可以看到它。)

2 个答案:

答案 0 :(得分:1)

如果以Windows Forms的方式执行此操作,它可以正常工作。将此代码粘贴到表单中:

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

答案 1 :(得分: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事件。最终用户确实看到了这种增长和缩小,但它确实如此 很快。