2016-07-19 4 views
2

私はC#の新機能ですが、構文が正確でない場合は、覚えようとしています。私はボタン付きのピクチャボックスを作成することができ、それは画面に表示されます。私はマウスの下/マウス移動機能を使って画面上を動かすことができます。その後、ボタンを押して作成する別のピクチャボックスをインスタンス化し、それを移動することもできますが、最初のピクチャボックスを移動しようとすると、代わりに2番目のピクチャボックスが移動し、狂ってしまいます。インスタンシエーション時にボックスを参照またはタグ付けする方法はありますか。そのため、それらのいずれかをクリックすると、それらを画面上で移動できます。複数のインスタンス化されたピクチャボックスを参照する

public partial class Form1 : Form 
{ 
    Point MP; 
    private static Control PB;   

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     int picSizeX = Properties.Resources.police.Width/3; 
     int picSizeY = Properties.Resources.police.Height/3; 

     PictureBox pb = new PictureBox(); 
     pb.Location = new Point(100, 100); 
     pb.Size = new Size(picSizeX, picSizeY); 
     pb.Image = new Bitmap(Properties.Resources.police); 
     pb.SizeMode = PictureBoxSizeMode.StretchImage; 
     Controls.Add(pb); 
     pb.Tag = "veh"; 
     PB = pb; 

     pb.MouseDown += Pb_MouseDown; 
     pb.MouseMove += Pb_MouseMove; 
     pb.MouseHover += Pb_MouseHover; 
    } 

    private void Pb_MouseHover(object sender, EventArgs e) 
    { 
     PB.MouseHover += PB_MouseHover; 
    } 

    private void PB_MouseHover(object sender, EventArgs e) 
    { 

    } 

    private void Pb_MouseDown(object sender, MouseEventArgs e) 
    { 
     MP = e.Location; 
    } 

    private void Pb_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      PB.Left = e.X + PB.Left - MP.X; 
      PB.Top = e.Y + PB.Top - MP.Y; 
     } 
    } 
} 
+0

私はあなたがこれを書いていたように編集でコードを投稿したと思います。ごめんなさい。 – Rob

+0

なぜ静的なコントロールをクラスレベルに保ったのですか? – Hassan

+0

それは私がそれを理解しようとしていたときにそこに残っていたゴミです。投稿する前に私はそれを消してしまったと思った。 – Rob

答えて

3

実際にコントロールをクラスレベルにする必要はありません。

イベントメソッドには、イベントを発生させるコントロール/オブジェクトへの参照を含むobject senderというパラメータがあります。

Point MP; 
//private Control PB; //commented out as it is not required 

public Form1() 
{ 
    InitializeComponent(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    int picSizeX = Properties.Resources.police.Width/3; 
    int picSizeY = Properties.Resources.police.Height/3; 

    PictureBox pb = new PictureBox(); 
    pb.Location = new Point(100, 100); 
    pb.Size = new Size(picSizeX, picSizeY); 
    pb.Image = new Bitmap(Properties.Resources.police); 
    pb.SizeMode = PictureBoxSizeMode.StretchImage; 
    Controls.Add(pb); 
    pb.Tag = "veh"; 
    //PB = pb; 

    pb.MouseDown += Pb_MouseDown; 
    pb.MouseMove += Pb_MouseMove; 
    pb.MouseHover += Pb_MouseHover; 
} 

private void Pb_MouseHover(object sender, EventArgs e) 
{ 
    Control pbObj = sender as PictureBox; //sender refers to control that raised the event 
    pbObj.MouseHover += PB_MouseHover; 
} 

private void PB_MouseHover(object sender, EventArgs e) 
{ 

} 

private void Pb_MouseDown(object sender, MouseEventArgs e) 
{ 
    MP = e.Location; 
} 

private void Pb_MouseMove(object sender, MouseEventArgs e) 
{ 
    Control pbObj = sender as PictureBox; //sender refers to control that raised the event 

    if (e.Button == MouseButtons.Left) 
    { 
     pbObj.Left = e.X + pbObj.Left - MP.X; 
     pbObj.Top = e.Y + pbObj.Top - MP.Y; 
    } 
} 
+1

私はあなたにキスすることができます。これはまさに私が長い間探してきた答えです。私はそれを理解するためにいくつかのより多くの学習がありますが、それは動作し、私は幸せです。ありがとうございました。 – Rob

関連する問題