Как переместить форму, когда мышь удерживается? - PullRequest
0 голосов
/ 07 октября 2009

У меня есть форма Windows, в которой нет рамки, заголовка, меню и т. Д. Я хочу, чтобы пользователь мог удерживать клавишу CTRL, щелкать левой кнопкой мыши в любом месте формы, перетаскивать ее и иметь это двигаться. есть идеи как это сделать? Я пробовал это, но он много мигает:

    private void HiddenForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            this.SuspendLayout();
            Point xy = new Point(this.Location.X + (e.X - this.Location.X), this.Location.Y + (e.Y - this.Location.Y));
            this.Location = xy;
            this.ResumeLayout(true);
        }
    }

1 Ответ

4 голосов
/ 07 октября 2009

Попробуйте это

using System.Runtime.InteropServices;

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

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


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

Обновление

Функция ReleaseCapture () освобождает захват мыши из окна в текущем потоке и восстанавливает обычную обработку ввода мышью. Окно, которое захватило мышь, получает все данные, введенные мышью, независимо от положения курсора, кроме случаев, когда кнопка мыши нажата, когда горячая точка курсора находится в окне другого потока.

Сообщение WM_NCLBUTTONDOWN отправляется окну, если щелкнуть левой кнопкой мыши в не клиентской области окна. WParam указывает значение перечисления для проверки попадания. Мы передаем HTCAPTION, а lParam указывает позицию курсора, которую мы передаем как 0, чтобы он обязательно находился в строке заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...