Перетаскивание формы за любое место (контролы в том числе) + закрытие по клику на любое место

59
01 января 2022, 02:30

Имеется форма без рамок с одним элементом axWindowsMediaPlayer. По сути, что то типа окна плеера. Хотелось бы передвигать форму за любое место + закрывать форму по клику. Использую следующий код, но не знаю, что добавить в него, чтобы закрывать форму по клику.

public partial class Form2 : Form, IMessageFilter
{
    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;
    public const int WM_LBUTTONDOWN = 0x0201;
    public const int WM_LBUTTONUP = 0x0202;
    [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 HashSet<Control> controlsToMove = new HashSet<Control>();
    public Form2()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
        controlsToMove.Add(this);
        controlsToMove.Add(this.axWindowsMediaPlayer1);
    }
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN && controlsToMove.Contains(Control.FromHandle(m.HWnd)))
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            return true;
        }
        return false;
    }
}
Answer 1

Спасибо rdorn за предложение. Решил таким образом.

public partial class Form2 : Form
{
    private Point MouseDownLocation;
    int x = 0;
    int y = 0;
    public Form2()
    {
        InitializeComponent();
    }
    private void AxWindowsMediaPlayer1_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
    {
        if (e.nButton == 1)
        {
            MouseDownLocation.X = e.fX;
            MouseDownLocation.Y = e.fY;
            x = this.Left;
            y = this.Top;
        }
    }
    private void AxWindowsMediaPlayer1_MouseMoveEvent(object sender, AxWMPLib._WMPOCXEvents_MouseMoveEvent e)
    {
        if (e.nButton == 1)
        {
            this.Left = e.fX + this.Left - MouseDownLocation.X;
            this.Top = e.fY + this.Top - MouseDownLocation.Y;
        }
    }
    private void AxWindowsMediaPlayer1_MouseUpEvent(object sender, AxWMPLib._WMPOCXEvents_MouseUpEvent e)
    {
        if (x <= this.Left + 10 && x >= this.Left - 10 && y <= this.Top + 10 && y >= this.Top - 10)
            Close();
    }
}
READ ALSO
Триггер не видит название кнопки которая вложена в popupbox. Как сделать чтобы триггер увидел название кнопки?

Триггер не видит название кнопки которая вложена в popupbox. Как сделать чтобы триггер увидел название кнопки?

Триггер не видит название кнопки которая вложена в popupbox но если кнопку вынести за пределы popupbox то все работаетКак сделать чтобы триггер увидел...

69
Консоль разработчика в онлайн игре

Консоль разработчика в онлайн игре

Есть авторитарный сервер и клиент на юнитиХотелось бы сделать в клиенте терминал (на "~", к примеру), в котором можно вводить чит коды, такие...

170
C# Билдер, Windows Forms

C# Билдер, Windows Forms

Задача такова:

175
Regexp разбить текст до 78 символов и чтобы не разбивались переводом строки шаблоны

Regexp разбить текст до 78 символов и чтобы не разбивались переводом строки шаблоны

По формату интернет сообщений в строке должно быть не более 78 символов не считая CRLFВ строке есть замена символов на 16-й формат со знаком равно...

84