代码之家  ›  专栏  ›  技术社区  ›  SiberianGuy

仅垂直移动窗体

  •  2
  • SiberianGuy  · 技术社区  · 14 年前

    如何创建只由标题栏垂直移动的WinForms窗体?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Hans Passant    14 年前

    你必须截获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);
            }
        }
    
        2
  •  3
  •   Henk Holterman    14 年前

    这样就行了(但不好看):

        private void MainForm_Move(object sender, EventArgs e)
        {
            this.Left = 100;
        }
    
        3
  •  1
  •   Thomas    14 年前

    您可以通过将窗体的位置重置为移动的初始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);
    }