代码之家  ›  专栏  ›  技术社区  ›  oɔɯǝɹ

如何创建有边框但没有标题栏的窗体?(类似于Windows7上的音量控制)

  •  24
  • oɔɯǝɹ  · 技术社区  · 15 年前

    在Windows7中,音量混音器窗口有一个特定的样式,有一个厚实、透明的边框,但没有标题栏。如何在WinForms窗口中重新创建该窗口样式?

    我尝试将文本设置为string.empty,并将controlBox设置为false,这将删除标题栏,但边框也会消失:

    厚实透明的边框,但没有标题栏。如何在WinForms窗口中重新创建该窗口样式?

    volume mixer

    我尝试将文本设置为string.empty,并将controlBox设置为false,这样会删除标题栏,但边框也会消失:

    3 回复  |  直到 15 年前
        1
  •  33
  •   Chris Schmich    15 年前
    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 形式上。

        2
  •  1
  •   Domi    9 年前

    因为“这篇编辑文章的目的是要解决作者的问题,作为一篇编辑文章毫无意义。它应该被写为评论或回答,“我将编辑的克里斯的回答作为一个新的答案。

    他的答案的代码可以按照描述工作-除了它还可以防止任何客户端区域鼠标事件发生。您需要返回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
  •  -1
  •   Matt Skeldon    9 年前

    form.formborderstyle=formborderstyle.fixed3d;