2016-04-24 82 views
1

我想將一個picturebox控件添加到在運行時創建的面板。 這是一個我正在研究的象棋遊戲。我想爲每個面板添加一個圖片框,稍後將圖片分配給控件。這是我到目前爲止有:(?)將控件添加到在運行時創建的另一個控件

//Sets the number of rows on the chess board 
for (int i = 0; i < 8; i++)   
{ 
    //Set the number of columns on the board 
    for (int j = 0; j < 8; j++)  
    { 
     ChessSquare sq = new ChessSquare(((char)(65 + i)).ToString(), 7- j); 
     sq.Color = (i + (j % 2)) % 2 == 0 ? Color.Black : Color.White; 

     Panel p = new Panel() 
     { 
      Size = new Size(blockSize, blockSize), 
      BackColor = sq.Color, 
      Tag = sq, 
      Location = new Point(blockSize * i + 15, blockSize * j + 15), 
      BackgroundImageLayout = ImageLayout.Stretch 
     }; 
     p.MouseEnter += new EventHandler(squareMouseEnter); 
     p.MouseLeave += new EventHandler(squareMouseLeave); 
     p.Click += new EventHandler(squareMouseClick); 

     chessBoardPanels[i, j] = p; 
     groupBox1.Controls.Add(p); 
    } 
} 
//SetUp Board 
SetUpBoad Setup = new SetUpBoad(); 
SetUpBoad(chessBoardPanels); 
+0

這是Winforms? –

+1

你的問題是什麼,到目前爲止遇到了什麼問題?編譯器錯誤?運行時錯誤? – Kateract

回答

1

既然你已經把​​到面板陣列

chessBoardPanels[i, j] = p; 

您可以添加PictureBoxes無論是現在或以後..:

PictureBox pb = new PictureBox(); 
pb.Size = .. 
pb.BackColor = Color.Transparent; 

chessBoardPanels[i,j].Controls.Add(pb); 

要在稍後訪問他們,你可以投出首ControlPictureBox

PictureBox pb = (PictureBox)chessBoardPanels[i,j].Controls[0]; 
pb.Image = aQueenImage; 

如果你想添加一個PictureBox只,其中一塊是你需要做的檢查:

if (chessBoardPanels[i,j].Controls.Count > 0) 
{ 
    PictureBox pb = (PictureBox)chessBoardPanels[i,j].Controls[0]; 
    pb.Image = aQueenImage; 
} 

一塊擺脫<i1,j1><i2, j2>你預期:

chessBoardPanels[i1,j1].Controls[0].Parent = chessBoardPanels[i2,j2]; 

我注意到你正在連接鼠標事件。如果你想用它們移動棋子,請記住透明度對於Winforms中的重疊控件不起作用,所以雖然棋子正在穿過​​,但它不會在Image周圍有工作傳輸。

雖然pBox嵌套在Panel中,但一切都很好,但要移動它,您必須首先將它作爲這些面板的父項的子項,並僅將其添加到目標Panel,MouseUp;座標校正是可以解決的,但tranparency,如果你需要它,將是一個更大的問題..

通常的建議是要考慮drawing至少那些板的廣場,甚至件到基礎登上─Panel(或板-PictureBox