Перемещение формы без полей с помощью Menustrip - PullRequest
4 голосов
/ 30 марта 2012

Я ищу способ перемещения формы с помощью меню.

Хотя есть несколько решений, есть определенная проблема, которая мне не нравится.Для того чтобы эти методы работали, перед перетаскиванием меню необходимо сфокусировать форму.

Есть ли способ исправить эту конкретную проблему, чтобы меню действительно работало как правильная строка заголовка окна?

1 Ответ

4 голосов
/ 30 марта 2012

Лучше всего использовать pinvoke.Свяжите событие «mousedown», к которому всегда нужно перетаскивать элемент управления.

using System.Runtime.InteropServices;

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[DllImportAttribute("user32.dll")]
private static extern int SendMessage(IntPtr hWnd,
                 int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
private static extern bool ReleaseCapture();

public Form1()
{
    InitializeComponent();
}

private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

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

private void menuStrip1_MouseHover(object sender, EventArgs e)
{
    Focus();
}

Обновление : при наведении мыши происходит небольшая задержка, движение мыши гораздо более отзывчиво

private void menuStrip1_MouseMove(object sender, MouseEventArgs e)
{
    if (!Focused)
    {
        Focus();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...