我正在尝试将一个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 :(得分:1)
由于您已将Panels
放入面板数组(?)
chessBoardPanels[i, j] = p;
您可以现在或稍后添加PictureBoxes
..:
PictureBox pb = new PictureBox ();
pb.Size = ..
pb.BackColor = Color.Transparent;
chessBoardPanels[i,j].Controls.Add(pb);
要稍后访问它们,您可以将其第一个Control
投射到PictureBox
:
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中的重叠控件,因此当一个棋子正在越过Panels
时,它将不具有工作透明度Image
。
虽然pBox嵌套在Panel中但一切都很好但是要移动它,你必须首先使它成为这些面板的父级的子级,并且只在Panel
上将它添加到目标MouseUp
};可以解决坐标修正问题,但如果需要,透明度将是一个更大的问题。
通常建议考虑drawing
至少那些棋盘方块,甚至可能是棋盘上的棋子 - Panel
(或棋盘 - PictureBox
)