C# 带有无边框样式控件的可拖动WinForm(覆盖)

C# 带有无边框样式控件的可拖动WinForm(覆盖),c#,.net,winforms,overlay,transparent,C#,.net,Winforms,Overlay,Transparent,我正在开发一个简单的覆盖应用程序,它的边框样式设置为“无”。 我希望能够拖动我的Winform,无论我是单击窗体还是它的控件 我发现了这个片段: protected override void WndProc(ref Message m) { switch(m.Msg) { case 0x84: base.WndProc(ref m); if ((int)m.Result == 0x1)

我正在开发一个简单的覆盖应用程序,它的边框样式设置为“无”。 我希望能够拖动我的Winform,无论我是单击窗体还是它的控件

我发现了这个片段:

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case 0x84:
            base.WndProc(ref m);
            if ((int)m.Result == 0x1)
                m.Result = (IntPtr)0x2;
            return;
    }

    base.WndProc(ref m);
}
这段代码允许我在不单击控件的情况下使窗体可拖动。 在触发mouseDown事件时,表单也应可在其他控件(如GroupBox)上拖动


备注:如果可能,复选框仍应能够被选中/取消选中。如果最后一点很复杂,我可以解决这个问题。

我可以通过返回-1来修复我的问题。m、 结果=IntPtr-1; 非常感谢你的建议

我只需要从GroupBox派生一个新类,并像这样重写WndProc:

public sealed partial class CustomGroupBox : GroupBox
{
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case 0x84:
                base.WndProc(ref m);
                if ((int)m.Result == 0x1)
                    m.Result = (IntPtr)(-1);
                return;
        }

        base.WndProc(ref m);
    }
}

警告的话。。。这类事情几乎总是有问题的,对用户来说几乎总是有点痛苦。尽量不要重新定义windows体验。我知道我应该尽量避免重新定义windows体验。但它将是一个非常简单的应用程序,只显示另一个程序的一些当前状态。这就是为什么我认为叠加是最好的解决方案,我将其设置在最上面,并从表单中删除背景。通过设置透明键=反颜色。如果窗口是可移动的,我会给窗口一个边框,如果我是你,我会考虑这些问题,你有一个代码气味。只需从GroupBox派生您自己的类,并以相同的方式重写WndProc。当你看到结果时,你会更好地理解为什么微软让他们的windows看起来像那样。@Hans Passant-这使得自定义控件可以拖动。也许我描述得不够好。主窗体应该可以拖动,即使我可以在GroupBox fx中单击。我目前正在尝试panel1\u MouseMove事件来完成这项工作。只是有位置问题:如果e.Button==MouseButtons.Left Location=newpointlocation.X,Location.Y;