Как захватить колесо мыши на панели? - PullRequest
21 голосов
/ 13 декабря 2010

Как захватить колесо мыши на панели в C #? Я использую WinForms

EDIT:

Я пытаюсь сделать это сейчас на PictureBox.

Мой код:

this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);    
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)  
  {  
    MessageBox.Show("Click");  
  }

Щелчок работает. Уиллинг не делает. Почему?

Ответы [ 5 ]

33 голосов
/ 09 сентября 2014

Если вы не видите событие «MouseWheel» на компоненте, вам необходимо создать его вручную.Кроме того, нам нужно сфокусировать этот компонент, иначе событие «MouseWheel» не будет работать для этого компонента.Я покажу вам, как создать событие «MouseWheel» для «pictureBox1» и как оно работает.

  1. ВНУТРИ КОНСТРУКТОРА создайте событие колесика мыши для этого компонента.

    InitializeComponent();
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
    
  2. СОЗДАЙТЕ ФУНКЦИЮ вручную.В соответствии с моим примером, назовите его «pictureBox1_MouseWheel»

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        //you can do anything here
    }
    
  3. СОЗДАЙТЕ событие MouseHover для этого компонента (перейдите в свойства в PicureBox1, выберите событие, найдите «MouseHover» и дважды щелкнитесобытие MouseHover).

  4. ВЫЗОВ «Фокус ()»;метод внутри этого события MouseHover.

    pictureBox1.Focus();
    
  5. Теперь запустите программу.

20 голосов
/ 13 декабря 2010

Windows отправляет сообщение WM_MOUSEWHEEL в элемент управления, имеющий фокус.Это не будет Panel, это не элемент управления, который сможет сфокусироваться.Как только вы поместите элемент управления на панель, скажем кнопку, кнопка получает фокус и сообщение.

Однако кнопка не имеет смысла для сообщения, ей нечего прокручивать.Windows замечает это и отправляет сообщение родителю.Это панель, теперь она будет прокручиваться.

Вы найдете код для пользовательской панели, который может получить фокус в этом ответе .


ОБНОВЛЕНИЕ: обратите внимание, что это поведение изменилось в Windows 10. Параметр «Прокручивать неактивные окна при наведении на них курсора» включен по умолчанию.Это делает поведение колеса мыши более совместимым с тем, как оно работает в браузере или, скажем, программе Office.В этом конкретном случае картинка теперь будет получать событие.Остерегайтесь этого.

7 голосов
/ 13 декабря 2010

Чтобы подключить его вручную ...

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
    ///process mouse event
}

Более простой метод в Visual Studio: щелкните панель, перейдите в панель свойств, выберите события, найдите и дважды щелкните событие «mousewheel».

5 голосов
/ 13 декабря 2010

В Winforms это достигается с помощью события Control.MouseWheel

1 голос
/ 30 апреля 2017

Получить события колесика мыши сложно.Самый простой способ - использовать

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

вместо

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

Таким образом, форма получает событие вместо элемента управления.Этот способ прост, но имеет одну проблему: вы можете использовать только одно событие mousewheel в вашей форме.

Если у вас есть несколько элементов управления для получения события mousewheel, лучший способ - Этот ответ от "Shehan Silva- weltZ "

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