从Windows窗体中移除标题栏(Windows 10风格)

11

我有一个非常简单的类,继承自System.Windows.Forms.Form并删除了WS_CAPTION窗口样式。它在Windows XP和7中工作得很好。在Windows 10中,标题栏仍然会被部分绘制,当使用自定义标题栏控件时看起来很丑。

我知道可能有几种方法可以实现这种外观,但出于多个原因,我选择了这种方法。我不感兴趣替代方法--这不是我的问题意图。

我的问题是,在Windows 10与Windows 7上呈现方式之间存在如此大的差异是什么原因? 差异不仅仅是款式上的。它似乎标题栏仍在某种程度上被渲染,即使已经删除了WS_CAPTION标志。

class BorderlessForm : System.Windows.Forms.Form
{
    protected override System.Windows.Forms.CreateParams CreateParams
    {
        get
        {
            var _CreateParams = base.CreateParams;
            _CreateParams.Style &= ~0x00C00000; // remove WS_CAPTION
            return _CreateParams;
        }
    }
}

Windows 7截图(期望的外观与MSDN描述一致):

在此输入图片描述

Windows 10截图(不期望出现,与MSDN描述不一致的外观):

在此输入图片描述


11
请给我看WinForms被弃用的MSDN文档,我会将其标记为答案... - Russell Trahan
我并没有说它被弃用了。我只是说它已经过时了,是遗留的技术。 - rory.ap
2
@rory.ap 你是说WPF可以创建不受Windows样式和类似东西约束的窗口吗?别开玩笑了,它仍然是好老的Windows操作系统。 - Ivan Stoev
1
你不应该用这种方式做,窗口太高了,请使用 ControlBox = False 和 Text = ""。否则无法解决此问题,它是非常奇怪的一个问题。我认为我最初在 Win 10.0.10586 看到它出问题。它看起来像 WM_NCCALCSIZE 没有被正确处理,但它并不是 Winforms 要操作的内容。嗯。希望下一个主要版本可以解决它,构建号码 14393(也称周年纪念版)已于8月2日发布。 - Hans Passant
1
@Hans 恰好是我希望的方向。我一直在尝试使用WmNCCalcSize找到可能的覆盖修复方法,但这有点像黑客行为。Controlbox = false会得到与我在这里展示的相同结果。 - Russell Trahan
显示剩余2条评论
1个回答

6
你所观察到的并不是标题栏,而是大小调整边框。
我的问题是:是什么导致这在Windows 10和Windows 7上呈现出如此不同的方式?
造成这种差异的原因是不同版本的Windows有不同的外观实现。
如果你想知道如何在Windows 10上甚至去掉大小调整边框:删除WS_THICKFRAME标志即可。
或者(也许更好)可以将你的窗体的FormBorderStyle更改为其他值。测试哪个效果最好。
然而,并没有什么东西能精确地定义整个窗体的边框。这取决于外观实现(主题)。从技术上讲,你不能期望在不同的实现下窗体的边框不会有所不同。你只能通过测试来确保。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接