Переместить форму только вертикально - PullRequest
2 голосов
/ 29 ноября 2010

Как создать форму WinForms, которая будет перемещаться в TitleBar только по вертикали?

Ответы [ 3 ]

5 голосов
/ 29 ноября 2010

Вы должны перехватить уведомление WM_MOVING, которое отправляет Windows.Вот код:

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 голосов
/ 29 ноября 2010

Это сделает это (но это не красиво):

    private void MainForm_Move(object sender, EventArgs e)
    {
        this.Left = 100;
    }
1 голос
/ 29 ноября 2010

Вы можете сократить операцию перемещения, сбросив местоположение вашей формы к начальному значению 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...