Как я могу обнаружить нажатую кнопку мыши над PictureBox?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Мне нужно вызвать событие, когда мышь находится над PictureBox, когда кнопка мыши уже нажата и нажата.

Проблемы:

Обработчики событий MouseDown и MouseEnter не очень хорошо работают вместе.

Например, когда кнопка мыши нажата и удерживается нажатой, C # запустит обработчик события MouseDown, но когда курсор перемещается над PictureBox, событие MouseEnter не срабатывает, пока кнопка мыши не будет выпущена.

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

Решение

Когда мышь нажата, большинство элементов управления будут Control.Capture вводить мышью. Это означает, что все события MouseMove отправляются исходному элементу управления, который захватил, а не элемент управления, над которым оказывается мышь. Это продолжается до тех пор, пока мышь не потеряет захват, который обычно происходит при наведении мыши вверх.

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

Application.AddMessageFilter(myFilterClassInstance);

Затем вам нужно реализовать IMessageFilter в подходящем классе ...

public class MyFilterClass : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_MOUSEMOVE)
            // Check if mouse is over my picture box!

        return false;
    }
}

Затем вы наблюдаете за событиями перемещения мыши и проверяете, находятся ли они над вашим графическим блоком, и делаете все, что хотите.

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

События мыши

Используйте событие MouseDown, чтобы просто обнаружить нажатие кнопки мыши и установить для this.Capture значение true, чтобы затем получать другие события мыши, даже когда мышь покидает элемент управления (т.е. вы не получите событие MouseLeave потому что вы захватили мышь). Отключите захват, установив this.Capture в значение false при возникновении MouseUp.

Просто проверяем состояние мыши

Это может быть неактуально, но вы можете проверить System.Windows.Control.MousePosition и посмотреть, находится ли оно в PictureBox.ClientRectangle , а затем проверить Статическое свойство Control.MouseButtons , для которого кнопки могут быть недоступны в любое время.

Как в:

if  (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition)))
{
   if ((Control.MouseButtons & MouseButtons.Left) != 0)
   {
     // Left button is down.
   }
}

Установите событие MouseMove в элементе управления PictureBox:

this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove);

Затем в вашем обработчике события MouseMove проверьте, нажата ли левая кнопка мыши (или что-то еще):

private void myPictureBox_MouseMove(object sender, MouseEventArgs e)
{  
     if (e.Button == MouseButtons.Left)
         // Do what you want to do
}

Если вы пытаетесь реализовать какую-либо операцию перетаскивания, вам нужно события Drag ... (DragEnter, DragDrop и т. д.) в окне получения изображения. использовать. По сути, вы запускаете операцию перетаскивания с помощью метода DoDragDrop исходного элемента управления, а затем для любого элемента управления, на который вы перетаскиваете, возникают события Drag ....

Поиск " DoDragDrop " на MSDN, чтобы увидеть, как это реализовать.

Лучший способ переместить форму на основе положения мыши и контроля относительного положения аналогичен тому, что опубликовал Ян Кэмпбелл.

    private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2);
            Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); 
        }

    }

Где imgMoveWindow - элемент управления PictureBox.

Бруно Ратниекс

Сети Sniffer

установите флаг или состояние при наведении мыши. отпустите на мышь вверх. При наведении мыши на огонь для графического окна проверьте свое состояние. Теперь вы можете определить, когда человек что-то перетаскивает.

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