2011-02-07 76 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似乎是,它希望在一段體面的數額顯示最大)

我想執行一些操作,當用戶點擊指定的圖片框,這就是爲什麼我有一個點擊方法,這是我遇到問題的地方,所有的圖片框被稱爲...圖片框。據我所知,我無法分辨用戶點擊了哪個圖片框。

我可能需要改變動態窗體的工作方式,因爲我無法獲得很多圖片框,但我認爲主要問題仍然存在,只要我希望它是動態的(我),並不是所有的貼圖都是相同的大小。

我從來沒有做過這樣的事情,我已經尋找方法來覆蓋onclick事件......我找不到,我找不到一個很好的tile-engine,它是最新的使用(XNA除外,但對於一個簡單的磁貼編輯器來說,這有些超出我的想象)

我可能會在相反的方向,然後我需要做什麼。

回答

3

您的事件處理程序中的發件人將是被點擊的PictureBox

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

...並且爲了完整性,您可能希望通過在該步驟後檢查確定您的投射是否有效 - 您可能會意外地將另一個對象的Click事件連接到該方法(儘管它可能只是我做的那樣的事情;))... – ZombieSheep 2011-02-07 15:21:12

+0

@ZombieSheep Yep;檢查爲空將預計......編輯爲「完整性」;) – 2011-02-07 15:43:11

1

難道你不能只在您的事件處理程序中將發件人對象轉換爲PictureBox並使用它嗎?

0

在事件處理的第一個參數是點擊的控制(這將是在PictureBox。

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

    // ... 
} 
0

我已經採取了地圖圖塊編輯器,以及這種方法。正如其他人所說,你可以使用sender參數並將其轉換爲PictureBox以獲得單擊的PictureBox對象,但我認爲您會發現(您可能已經擁有)一個體面的地圖大小會真的放慢速度。

您可能會重新考慮XNA,它看起來很複雜,並不容易,只是生成一堆PictureBox對象而已,但它速度很快,而且我您可以快速獲取正在顯示的二維地圖。例如,如果您希望地圖具有不同的可編輯圖層(地形等),則還可以更容易地擴展它。

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作爲參數,因此它知道它應該在哪個對象上工作。