2010-11-29 57 views
2

如何创建一个仅由TitleBar垂直移动的WinForms表单?只能垂直移动表格

+0

自动移动?? “感动”是什么意思? – Shoban 2010-11-29 09:40:30

+0

我的意思是当用户移动窗体时,不应该水平移动 - 只能垂直移动 – SiberianGuy 2010-11-29 09:42:22

回答

5

您必须拦截Windows发送的WM_MOVING通知消息。这里的代码:

using System.Runtime.InteropServices; 
... 
    public partial class Form1 : Form { 
     public Form1() { 
      InitializeComponent(); 
     } 
     private struct RECT { 
      public int left, top, right, bottom; 
     } 
     protected override void WndProc(ref Message m) { 
      if (m.Msg == 0x216) { // Trap WM_MOVING 
       var rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); 
       int w = rc.right - rc.left; 
       rc.left = this.Left; 
       rc.right = rc.left + w; 
       Marshal.StructureToPtr(rc, m.LParam, false); 
      } 
      base.WndProc(ref m); 
     } 
    } 
3

这将做到这一点(但不漂亮):

private void MainForm_Move(object sender, EventArgs e) 
    { 
     this.Left = 100; 
    } 
+0

您的解决方案可以正常工作,但形式抽搐 – SiberianGuy 2010-11-29 10:36:42

+0

我说这不太好。 – 2010-11-29 10:37:29

1

您可以通过表单的位置重置为初始X值和移动的Y值快捷的移动操作。这个解决方案很简单,但会闪烁一点。

protected Point StartPosition { get; set; } 

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    StartPosition = this.Location; 
} 

protected override void OnMove(EventArgs e) 
{ 
    if (StartPosition == new Point()) 
     return; 

    var currentLocation = Location; 

    Location = new Point(StartPosition.X, currentLocation.Y); 

    base.OnMove(e); 
}