Событие перемещения мыши Picturebox сработало даже тогда, когда мышь не двигалась - PullRequest
2 голосов
/ 08 июня 2011

Я занимаюсь разработкой приложения для Windows C #, VS 2008. У меня есть форма MDI-контейнера, к которой я добавляю новую форму во время выполнения при нажатии кнопки. Когда дочерняя форма создана, я добавляю к ней во время выполнения панель управления и элемент управления графическим блоком для панели.

Я добавляю обработчики событий мыши для перемещения мыши вверх, вниз и перемещения мыши для графического окна. Мышь вверх и вниз работает, как и ожидалось, но событие перемещения мыши постоянно срабатывает, когда мышь находится над картинкой и не движется. Я знаю, что событие запускается, потому что внутри события перемещения мыши я сохраняю переменную счетчика, увеличиваю и обновляю значение до метки каждый раз, когда вызывается событие mousemove.

Почему это происходит? Код, который я использую ниже.

Спасибо

            Form frm = new Form();
            frm.Deactivate += new EventHandler(MDIChildDeactivate);
            PictureBox pi = new PictureBox();
            pi.Dock = DockStyle.Fill;

            pi.MouseUp += new MouseEventHandler(ImageMouseUp);
            pi.MouseDown += new MouseEventHandler(ImageMouseDown);                
            pi.MouseMove += new MouseEventHandler(ImageMouseMove);
            pi.Paint += new PaintEventHandler(CanvasPaint);
            pi.KeyDown += new KeyEventHandler(ImageKeyDown);
            pi.KeyPress += new KeyPressEventHandler(ImageKeyPress);

            /////////////////////////////////////////////////////////
            pi.PreviewKeyDown += new PreviewKeyDownEventHandler(pi_PreviewKeyDown);
            /////////////////////////////////////////////////////////

            if (!IsTabbedMdi)
                frm.ClientSize = size;
            frm.AutoScroll = true;
            pi.Name = ProjectFileName;

            Panel pnl = new Panel();
            pnl.Dock = DockStyle.None;
            pnl.Size = WarpArt.Properties.Resources.GreyCheckerBoard.Size;
            pi.Image = WarpArt.Properties.Resources.GreyCheckerBoard;
            pnl.AutoScroll = true;
            pnl.HorizontalScroll.Visible = true;
            pnl.VerticalScroll.Visible = true;
            pnl.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            pnl.Name = ProjectFileName;

            pnl.Controls.Add(pi);
            frm.Controls.Add(pnl);
            frm.MdiParent = this;
            frm.Show();

Ответы [ 2 ]

0 голосов
/ 18 марта 2016

Есть несколько способов обойти это. Однако это, вероятно, самое простое решение. Грязно, но это работает.

private void MouseMove(object sender, MouseEventArgs e)
        {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                 //dosomething
                }
        }

Чтобы объяснить это; Когда вызывается событие MouseMove, оно ничего не будет делать, если (в этом случае) не нажата левая кнопка мыши. Только после этого выполняется код в операторе if.

0 голосов
/ 18 марта 2016

У меня была похожая проблема, когда движущееся изображение с мышью на панели шокировало.Я использовал Control.MousePosition вместо MouseEventArgs.Location.Это происходит из-за того, что событие MouseMove picturebox запускается, даже если мышь сама по себе не двигается, но находится в PictureBox.

...