2011-02-07 3 views
1

私は絵ボックスC#動的フォームヘルプ

画像を生成するコードを(私はフォームにタイルをスローするように考えることが最も簡単な方法)を使用してC#でのタイルマップエディタの何かを作るしようとしていますボックスは、次のとおりです。

public void Generate_Tiles(int width, int height) 
     { 
      for (int x = 0; x < width; x++) 
      { 
       for (int y = 0; y < height; y++) 
       { 
        System.Windows.Forms.PictureBox picturebox = new PictureBox(); 
        picturebox.BackColor = SystemColors.ActiveCaption; 
        picturebox.Cursor = Cursors.Cross; 
        picturebox.Location = new System.Drawing.Point((x*32) + 4, (y*32) + 4); 
        picturebox.Name = x+y+"tile"; 
        picturebox.Size = new System.Drawing.Size(32, 32); 
        picturebox.TabIndex = 0; 
        picturebox.TabStop = false; 
        picturebox.Click += new System.EventHandler(TileBox_Clicked)); 
        map.Controls.Add(picturebox); 
       } 
      } 
      MessageBox.Show("Done"); 
     } 

一部の機能することを、限り、私は一度に画像ボックスの小さな番号を使用して(8×8は、それが時間のまともな金額で表示させたいことを最大のようです)

ユーザーが指定した画像ボックスをクリックしたときに何らかのアクションを実行したいのですが、これが原因です私が問題に遭遇するところでは、すべての画像ボックスは...画像ボックスと呼ばれています。私が知る限り、ユーザーがクリックした画像ボックスを教えてくれる方法はありません。

私はおそらく動的フォームが動作する方法をリメイクする必要があります。なぜなら、非常に多くの画像ボックスを得ることができないからです。しかし、私はそれが動的になりたい限り、メインの問題はまだそこにあると思いますdo)、すべてのタイルマップが同じサイズになるわけではありません。

私はこのようなことは一度もしませんでしたが、私はonclickイベントをオーバーライドする方法を探しました。私は見つけられませんでした。使用するのに最新のタイルエンジンが見つかりませんでした(XNAを除いて、それは単純なタイルエディタでは少し上にあると思います)

私は何をする必要があるのでしょうか。

答えて

3

イベントハンドラの送信者は、クリックされたPictureBoxになります。

void TileBox_Clicked(object sender, EventArgs e) 
    { 
     PictureBox pictureBox = sender as PictureBox; 
     if(pictureBox != null) 
     { 
      //do stuff with your pictureBox 
     } 
    } 
+0

...完全性のために、そのステップの後でmullをチェックすることでキャスティングの動作を確認したいと思うかもしれません - あなたは誤って別のオブジェクトのClickイベントをそのメソッドに接続するかもしれません(ただし、 ;))... – ZombieSheep

+0

@ ZombieSheep Yep; "完全性"のために編集されました;) –

+0

> _>私は、送信者であるオブジェクトが特に必要とするオブジェクトを参照する場合、PictureBoxであるオブジェクトの名前が重要でないことを忘れていたと思います。私は思っています、送信者経由で1つのピクチャボックスを変更しようとすると、それらはすべて変更されていましたが、今私はそれについて考えて、彼らはすべてユニークなポインタを持っています... – RyanTimmons91

1

送信者オブジェクトをイベントハンドラ内のピクチャボックスにキャストして処理することはできませんか?

0

あなたのイベントハンドラの最初のパラメータは、ピクチャになり、クリックされたコントロール(である。

private void pictureBox1_Click(object sender, System.EventArgs e) 
{ 
    PictureBox pb = (PictureBox)sender; 

    // ... 
} 
0

私もマップタイルエディタで、このアプローチを取ってきました。他の人が言ったように、あなたができますsenderパラメータを使用してPictureBoxにキャストして、クリックされたPictureBoxオブジェクトを取得してください。しかし、私は、あなたが既に持っていると思うでしょうが、マップサイズが実際には遅くなることは本当に遅くなると思います。 XNA。複雑で、PictureBoxオブジェクトの束を生成するだけの作業をするのは簡単ではありませんが、高速です。あなたは2Dマップをかなり速く表示することができます。マップに異なる編集可能なレイヤー(地形など)を設定したい場合など、さらに簡単に拡張することもできます。

+0

私たちは実際に各タイルを1つの大きな画像256/256 XNAを使ってトップダウンではなく3Dにする予定ですが、今はゲーム開発者のための基本的なシステムを使いたいと思っています私たちはエンドユーザにとって見栄えを良くすることについて心配します:D – RyanTimmons91

0

実際にこれを行う方法はたくさんあります。私は、最も簡単には戻ってクリックされたボタンにあなたを指すようになりますされ、あなたのイベントハンドラのsenderを使用することであると思う:

private void PictureBox_Click(object sender, EventArgs e) 
{ 
    var box = sender as PictureBox; 
    if (box != null) 
    { 
     //... 

あなたも興味深いオプションである、動的にイベントハンドラを作成して追加することができます。

 //... 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       System.Windows.Forms.PictureBox picturebox = new PictureBox(); 

       pictureBox.Click += new Action<object, EventArgs>(
        (sender, e) => { doStuff(pictureBox); } 
       ); 

上記のコードでは、doStuffはパラメータとしてpictureBoxを取得するので、どのオブジェクトが正常に動作するはずです。