Как я могу обнаружить удерживаемую кнопку мыши над PictureBox?
Мне нужно запустить событие, когда мышь находится над PictureBox с кнопкой мыши уже нажата и удерживается.
проблемы:
обработчики событий MouseDown и MouseEnter работают не очень хорошо.
например, как только кнопка мыши нажата и удерживается, C# запускает обработчик событий MouseDown, но когда курсор перемещается по PictureBox, событие MouseEnter не запускается, пока кнопка мыши не будет выполнена.
6 ответов
когда мышь нажата, большинство элементов управления будет тогда управление.Захват ввода мыши. Это значит, что все событие 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, чтобы просто обнаружить нажатие кнопки мыши и установить это.Захват в true, чтобы затем получить другие события мыши, даже когда мышь покидает элемент управления (т. е. вы не получите событие MouseLeave, потому что вы захватили мышь). Отпустите захват, установив это.Захват в 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
}
Если вы пытаетесь реализовать какую-то операцию перетаскивания, перетащить... события (DragEnter, DragDrop etc .) на получая коробке изображения чего вы хотите использовать. В принципе, вы начинаете операцию перетаскивания с помощью метода DoDragDrop исходного элемента управления, а затем любой элемент управления, который вы перетаскиваете, будет иметь его перетаскивание... события.
Поиск "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 Networks
установите флаг или состояние на мыши вниз. отпустите его на мыши вверх. Когда на мыши над пожарами для окна изображения Проверьте свое состояние. Теперь вы можете обнаружить, когда человек что-то тащит.