MouseWheel событие с Picturebox? - PullRequest
5 голосов
/ 03 августа 2010

Я хочу навести указатель мыши на графический блок (или все рисунки и основную форму) и использовать колесико мыши для прокрутки.Однако мне не повезло.Я написал pictureBox1.MouseWheel и проверил дельту.Я установил точку останова, когда это! = 0. Пока что независимо от того, что я сделал, я не мог добиться чего-либо.Я тоже попробовал мышиный ход, и это не сработало.Однако взлом на оператор if работает.Я просто никогда не могу заставить колесо работать.

Как мне заставить picturebox (или любой элемент управления в форме) вызывать событие mousewheel?

-edit- nevermind.Я добавил событие к объекту, который имеет событие большую часть времени.Это работает довольно хорошо.Я не уверен, почему я не думал об этом до того, как написал этот вопрос.Я все еще открыт для решения мыши + колеса.

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

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

Это поведение становится не интуитивным из-за работы браузеров и программ Office.Вы найдете код для изменения этого в моем ответе в этой теме .Помните, что он работает на любом окне вашего приложения.Вам придется добавить фильтрацию к значению дескриптора, если это нежелательно.


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

1 голос
/ 24 января 2014

Этот ответ объясняет, как это сделать. Короче говоря, создайте событие MouseEnter в графическом блоке, который просто фокусирует графический блок. Тогда картинка-бокс будет получать события MouseWheel просто отлично.

0 голосов
/ 10 марта 2019

Просто переопределите колесо мыши формы и проверьте, находятся ли eX и eY в области расположения PictureBox

  protected override void OnMouseWheel(MouseEventArgs e)
    {
        if (e.X >= soundGraph.Location.X && e.X <= soundGraph.Location.X + soundGraph.Width
            &&
            e.Y >= soundGraph.Location.Y && e.Y <= soundGraph.Location.Y + soundGraph.Height)
        { // do what you have to
        }
        base.OnMouseWheel(e);
    }
0 голосов
/ 20 мая 2015

Ответы здесь не работают для меня.У меня есть окно с картинками в прокручиваемой панели, и для правильного функционирования требуется немного больше работы.

Вам нужно переписать функцию OnMouseWheel() в форме.Там вы получаете событие wheel и должны проверить, находится ли мышь внутри картинки.Но этого недостаточно.Представьте, что вы отображаете изображение размером 5000 x 5000 пикселей внутри прокручиваемой панели, которая показывает только небольшую часть изображения.Затем вы должны также проверить, находится ли мышь над панелью и всеми ее родителями.Приведенный ниже код работает независимо от положения полосы прокрутки на любом из родительских элементов управления pictureBox.

/// <summary>
/// This must be overridden in the Form because the pictureBox never receives MouseWheel messages
/// </summary>
protected override void OnMouseWheel(MouseEventArgs e)
{
    // Do not use MouseEventArgs.X, Y because they are relative!
    Point pt_MouseAbs = Control.MousePosition; 
    Control i_Ctrl = pictureBox;
    do
    {
        Rectangle r_Ctrl = i_Ctrl.RectangleToScreen(i_Ctrl.ClientRectangle);
        if (!r_Ctrl.Contains(pt_MouseAbs))
        {
            base.OnMouseWheel(e);
            return; // mouse position is outside the picturebox or it's parents
        }
        i_Ctrl = i_Ctrl.Parent;
    }
    while (i_Ctrl != null && i_Ctrl != this);

    // here you have the mouse position relative to the pictureBox if you need it
    Point pt_MouseRel = pictureBox.PointToClient(pt_MouseAbs);

    // Do your work here
    ....
}
...