Переместите безграничную кнопку Winform, удерживая правую кнопку мыши, возможно, с помощью местных методов

StackOverflow https://stackoverflow.com/questions/5827208

Вопрос

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

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

Я читал много вещей, и этот пост выглядит полезно

http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/b9985b19-cab5-4fba-9dc5-f323d0d37e2f/

Я пробовал различный способ использовать это и просмотрел http://msdn.microsoft.com/en-us/library/ff468877%28v=vs.85%29.aspx Чтобы найти другие полезные вещи, и WM_NCRBUTTONDOWN пришел мне в голову, однако WNDPROC не обнаруживает этого, может быть, потому что он обрабатывается формой?

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

Франческо

Это было полезно?

Решение

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);
    }
}

Другие советы

Вам нужно два метода P/вызывают это, чтобы сделать это.

[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);
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top