3

我正在开发一个 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();
4

2 回答 2

1

在面板中使用鼠标移动图片时,我遇到了类似的问题。我用Control.MousePosition而不是MouseEventArgs.Location. 发生这种情况是因为即使鼠标本身没有移动,但它在 PictureBox 上也会触发图片框 MouseMove 事件。

于 2016-03-18T07:31:10.007 回答
0

有多种方法可以规避这一点。然而,这可能是最简单的解决方案。脏,但它的工作原理。

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

解释这一点;当调用 MouseMove 事件时,除非按下(在这种情况下)鼠标左键,否则它不会做任何事情。只有这样 if 语句中的代码才会被执行。

于 2016-03-18T08:44:02.930 回答