Как я могу обнаружить нажатую кнопку мыши над PictureBox? - PullRequest
11 голосов
/ 04 октября 2008

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

Проблемы:

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

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

Ответы [ 6 ]

14 голосов
/ 04 октября 2008

Когда мышь нажата, большинство элементов управления будут тогда 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;
    }
}

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

13 голосов
/ 04 октября 2008

События мыши

Используйте событие 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.
   }
}
5 голосов
/ 29 ноября 2010

Установите событие 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
}
3 голосов
/ 04 октября 2008

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

Выполните поиск «DoDragDrop» в MSDN, чтобы увидеть, как это реализовать.

0 голосов
/ 19 мая 2011

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

    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

0 голосов
/ 04 октября 2008

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

...