Переместите Winform без полей, удерживая правую кнопку мыши, возможно, с нативными методами - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть ситуация, когда я хотел бы переместить форму окна, удерживая правую кнопку мыши в ее клиентской области;форма, как я уже сказал, без полей.

Я бы хотел переместить ее "изначально" (если возможно, в противном случае другие ответы тоже подойдут).Я имею в виду, как он ведет себя, когда вы удерживаете левую кнопку мыши на заголовке (при перемещении мыши и подобных вещах я получаю много странного поведения, но, возможно, это только я).

Я прочитал вокругмного вещей, и эта статья выглядит полезнойпомните, однако wndproc не обнаруживает его, может быть, потому что он обрабатывается формой?

Любые предложения приветствуются, спасибо

Франческо

Ответы [ 2 ]

5 голосов
/ 07 мая 2011
public partial class DragForm : Form
{
    // Offset from upper left of form where mouse grabbed
    private Size? _mouseGrabOffset;

    public DragForm()
    {
        InitializeComponent();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if( e.Button == System.Windows.Forms.MouseButtons.Right )
            _mouseGrabOffset = new Size(e.Location);

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        _mouseGrabOffset = null;

        base.OnMouseUp(e);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (_mouseGrabOffset.HasValue)
        {
            this.Location = Cursor.Position - _mouseGrabOffset.Value;
        }

        base.OnMouseMove(e);
    }
}
1 голос
/ 29 апреля 2011

Для этого нужно два метода P / Invoke.

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

Пара констант:

const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;

Обработайте событие MouseDown в вашей форме, затем сделайте следующее:

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
    }
}

Это отправит вашу форму тому же событию, которое она получает, когда мышь щелкает и удерживает область заголовка. Переместите мышь, и окно переместится. Когда вы отпустите кнопку мыши, движение остановится. Очень просто.

...