2017-06-02 14 views
0

私は単純な2dマップエディタを持っており、マップはピクチャボックスのグリッドです。PictureBoxのMouseDownイベントを機能させるには?

のMouseDown:

 for (int row = 0; row < GlobalConstants.TileRows; row++) 
     { 
      for (int col = 0; col < GlobalConstants.TileCols; col++) 
      { 
       PictureBox pb = new PictureBox(); 
       pb.Size = size; 
       Point loc = new Point(GlobalConstants.TileWidth * col, GlobalConstants.TileHeight * row); 
       Rectangle srcRect = new Rectangle(loc, size); 
       pb.Location = loc; 
       pb.Tag = loc; 
       pb.Name = String.Format("Col={0:00}-Row={1:00}", col, row); 
       pb.MouseDown += pbMap_MouseDown; 
       pb.MouseUp += pbMap_MouseUp; 
       pb.MouseEnter += pbMap_MouseEnter; 
       pnlMap.Controls.Add(pb); 
      } 
     } 

3つのマウスイベントがあり、ピクチャを下に押すと、選択した項目で画像を埋めます。 m_mouseDownはここではtrueに設定されています。

MouseUp:m_mouseDownがfalseに設定されています。

MouseEnter:m_mouseDownがtrueの間、現在選択されているタイルを使用して、ピクチャボックスイメージを更新します。私はのMouseEnterに問題を抱えている

:最初のPictureBoxの画像がMouseDownイベント上に示しているが

private void pbMap_MouseEnter(object sender, EventArgs e) 
    { 
     if (m_mouseDown) 
     { 
      PictureBox pb; 

      pb = (PictureBox)sender; 

      if (m_pbSelected != null) 
      { 
       pb.Tag = m_pbSelected.Tag; 
       pb.Name = m_pbSelected.Name; 
       pb.Image = m_pbSelected.Image; 
      } 
     } 
    } 

、私がダウンして、マウスボタンを保持し、下方向にマウスをドラッグします。マウスが入力したピクチャボックスは更新されません。クリック1回で更新されるだけですが、マウスボタンを押したまま更新してもらいたいです。

if(m_mouseDown)条件を削除すると、ピクチャボックスはイメージを選択したイメージに更新します。もちろん、私はそれを移動している間、マウスのボタンを押さない。条件を戻すと、MouseDownイベントで1つのピクチャボックスしか更新されません。

私のマウスのアップ/ダウンコード:

/// <summary> 
    /// Map panel's mouse down event 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void pbMap_MouseDown(object sender, EventArgs e) 
    { 
     m_mouseDown = true; 

     MouseEventArgs m = (MouseEventArgs)e; 
     PictureBox pb; 

     if (m.X >= (GlobalConstants.TileWidth * GlobalConstants.TileCols)) 
      return; 

     if (m.Y >= (GlobalConstants.TileHeight * GlobalConstants.TileRows)) 
      return; 

     pb = (PictureBox)sender; 

     if (m_pbSelected != null) 
     { 
      pb.Tag = m_pbSelected.Tag; 
      pb.Name = m_pbSelected.Name; 
      pb.Image = m_pbSelected.Image; 
     } 
    } 

    /// <summary> 
    /// Map panel's mouse up event 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void pbMap_MouseUp(object sender, EventArgs e) 
    { 
     m_mouseDown = false; 
    } 

それは言及することが重要だ場合は、pictureboxesは、パネルコントロール内にあります。パネルにマウスイベントはありません。

アイデアをいただければ幸いです。ありがとう。

+1

ボタンが押し下げられている間、マウスがコントロールされているため、マウスが動かなくなります。 mouseUpはマウスが実際にある場所ではなく、元のコントロールにのみ発生します。 - それらはルールです。回避しようとする前に、実際のガールをもっとはっきりと述べてください。私たちはx-y-problemで作業しません! - _私はマウスボタンを押し下げたままマウスを下にドラッグします...もちろん、私はそれを動かしている間はマウスのボタンを押していません。これは私には矛盾しているようです! – TaW

+1

遅かれ早かれ、誰もがPictureBoxがGraphics.DrawImage()のかなり厄介な代替品であることを発見します。それはまだマウスヒットテストには少し役立つかもしれませんが、それが途中で始まると、本当にダンプする時間です。 –

+0

入手したソースコードのデモに基づいて、正常に動作します。現在それを勉強しています。 – Phil

答えて

0

mouseDownのカーソル位置に画像の位置を更新するタイマーを作成し、mouseUpでタイマーを停止することができます。

関連する問題