2014-09-22 38 views
0

我正在一个简单的覆盖应用程序,其中边框样式设置为“无”。
我希望能够拖动我的Winform,无论我点击窗体还是其控件。Draggable 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); 
} 

move a c# form without border style (by ShaneB)
这个片段让我使窗体dragable,如果我不上单击控件。
表单也应该可以在其他控件上拖动(如groupboxes),同时触发mouseDown事件。

备注:如果可能的话,复选框应该仍然可以选中/取消选中。如果最后一点应该是复杂的,我可以解决这个问题。

+0

提醒一句......这种事情几乎总是有问题的,几乎总是有点的给用户带来痛苦。尽量不要重新定义Windows体验。 – BenjaminPaul 2014-09-22 08:44:25

+0

我知道我应该尽量避免那种重新定义Windows体验。但它将是一个非常简单的应用程序,它只是显示另一个程序的一些当前状态。这就是为什么我通过覆盖将是最好的解决方案,我在TopMost上设置并从窗体中移除背景。 (通过设置TransparencyKey == BackColor)。 – MrMAG 2014-09-22 08:50:36

+0

如果窗口应该是可移动的,我会给窗口一个边框,如果我是你,我会考虑这些问题,你有代码味道。 – BenjaminPaul 2014-09-22 08:58:37

回答

0

我能够通过返回-1来解决我的问题。 (m.Result = (IntPtr)(-1);
非常感谢Hans Passant您的建议。

我只是需要从分组框派生新类和重写的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); 
    } 
}