如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)

Posted

技术标签:

【中文标题】如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)【英文标题】:How to create a form with a border, but no title bar? (like volume control on Windows 7) 【发布时间】:2011-04-05 09:04:06 【问题描述】:

在 Windows 7 中,音量混合器窗口具有特定的样式,具有厚实的透明边框,但没有标题栏。如何在 winforms 窗口中重新创建该窗口样式?

我尝试将 Text 设置为 string.Empty,并将 ControlBox 设置为 false,这会删除标题栏,但随后边框也会消失:

【问题讨论】:

【参考方案1】:
form.Text = string.Empty;
form.ControlBox = false;
form.FormBorderStyle = FormBorderStyle.SizableToolWindow;

对于固定大小的窗口,您仍应使用FormBorderStyle.SizableToolWindow,但您可以覆盖表单的WndProc 以忽略非客户端命中测试(用于切换到调整大小的光标):

protected override void WndProc(ref Message message)

    const int WM_NCHITTEST = 0x0084;

    if (message.Msg == WM_NCHITTEST)
        return;

    base.WndProc(ref message);

如果您想真正强制执行大小,您还可以在表单上将MinimumSize 设置为等于MaximumSize

【讨论】:

不,这会完全移除边框 @oɔɯǝɹ: form.FormBorderStyle = FormBorderStyle.SizableToolWindow 对我来说似乎工作正常。 @oɔɯǝɹ: FixedToolWindow 确实删除了 3D 边框。请参阅我的更新答案,以获取完整的 3D 边框的固定大小行为。 我试图通过FixedSingle 实现这一目标。这个答案对我来说的解决方案是将表单文本设置为空。【参考方案2】:

因为“此编辑旨在针对帖子的作者,作为编辑毫无意义。它应该被写成评论或答案。”我对 Chris 的回答进行了编辑,作为新的回答。

他的答案的代码与描述的一样 - 除了它还可以防止任何客户区鼠标事件发生。您需要返回 1(如在 HTCLIENT 中)来解决此问题。

protected override void WndProc(ref Message message)

    const int WM_NCHITTEST = 0x0084;
    const int HTCLIENT = 0x01;

    if (message.Msg == WM_NCHITTEST)
    
        message.Result = new IntPtr(HTCLIENT);
        return;
    

    base.WndProc(ref message);

【讨论】:

【参考方案3】:

form.FormBorderStyle = FormBorderStyle.Fixed3D;

【讨论】:

虽然此代码可能有助于解决问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。

以上是关于如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)的主要内容,如果未能解决你的问题,请参考以下文章

如何快速删除导航栏的边框?

如何创建不添加边距的边框?

如何创建标准无边框按钮(如提到的设计指南中)?

如何为下拉菜单制作 CSS 边框?

如何删除带有大标题的导航栏的底部边框?

图片框不显示图像