3

Windows C#、VS 2008 アプリケーションを開発しています。ボタンのクリック時に実行時に新しいフォームを追加する MDI コンテナー フォームがあります。子フォームが作成されたら、実行時にパネル コントロールとピクチャ ボックス コントロールをパネルに追加します。

ピクチャ ボックスのマウス アップ、マウス ダウン、およびマウス移動のマウス イベント ハンドラーを追加します。マウスの上下は期待どおりに機能しますが、マウスがピクチャボックス上にあり、移動していない場合、マウスの移動イベントが継続的に発生します。マウス移動イベント内でカウンター変数を保持し、マウス移動イベントが呼び出されるたびに値をインクリメントしてラベルに更新するため、イベントが発生していることがわかります。

なぜこれが起こるのですか?私が使用しているコードは以下です。

ありがとう

            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 イベントが発生するために発生しますが、PictureBox 上にあります。

于 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 に答える