目录
前言
当需要向窗体或者容器中添加具有一定排列规则并且数量比较多的控件时,就需要通过代码动态添加控件。
一、界面设计
窗体中需要添加Btton,GroupBox,numericUpDown,timer等控件,如图所示。
二、关键技术
1.动态添加控件
代码如下:
PictureBox[,] resultPicBoxs = new PictureBox[100, 100];
int colNum = 0;//显示的列数
int rowNum = 0;//显示的行数
private void btnAddPictureBox_Click(object sender, EventArgs e)
{
grbResultShow.Controls.Clear();//清除显示框的所有控件
colNum = (int)nudColNum.Value;
rowNum = (int)nudRowNum.Value;
int offsetX = 10;//X方向的间距
int offsetY = 20;//Y方向的间距
int picBoxsLength = 0;
if (colNum != 0 && rowNum != 0)
{
int picBoxsWidth = (grbResultShow.Size.Width) / (colNum+1);
int picBoxsHight = (grbResultShow.Size.Height) / (rowNum+1);
if (picBoxsWidth < picBoxsHight)
{
picBoxsLength = picBoxsWidth;//把短边设置为正方形的长
}
else
{
picBoxsLength = picBoxsHight;
}
offsetX = (grbResultShow.Size.Width - colNum * picBoxsLength) / 2;
offsetY = (grbResultShow.Size.Height - rowNum * picBoxsLength) / 2;
for (int row = 0; row < nudRowNum.Value; row++)
{
for (int col = 0; col < colNum; col++)
{
resultPicBoxs[row, col] = new PictureBox();
resultPicBoxs[row, col].BackColor = System.Drawing.Color.Gray;
if (row % 2 == 0)//蛇形排布
{
resultPicBoxs[row, col].Location = new System.Drawing.Point(offsetX + col * picBoxsLength, offsetY + row * picBoxsLength);
}
else
{
resultPicBoxs[row, col].Location = new System.Drawing.Point(offsetX + (colNum - col - 1) * picBoxsLength, offsetY + row * picBoxsLength);
}
resultPicBoxs[row, col].Name = "resultPicBoxs[" + (row).ToString() + "," + (col).ToString() + "]";
resultPicBoxs[row, col].Size = new System.Drawing.Size(picBoxsLength - 2, picBoxsLength - 2);
grbResultShow.Controls.Add(resultPicBoxs[row, col]);
}
}
rowNumNow = 0;
colNumNow = 0;
btnStart.Enabled = true;
}
}
2.改变控件颜色实现跑马灯效果
先创建一个下一个是什么颜色的枚举
代码如下:
enum NextColor
{
red,
yellow,
green,
}
NextColor nextColor;
通过timer控件来循环改变控件的背景颜色
代码如下:
bool flagRun = false;//是否在运行的标志位
/// <summary>
/// 开始按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
flagRun = true;
btnStop.Enabled = true;
btnStart.Enabled = false;
btnAddPictureBox.Enabled = false;
}
/// <summary>
/// 停止按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
flagRun = false;
btnStop.Enabled = false;
btnStart.Enabled = true;
btnAddPictureBox.Enabled = true;
}
int rowNumNow = 0;
int colNumNow = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if(flagRun)
{
switch(nextColor)
{
case NextColor.red:
if (resultPicBoxs[rowNumNow, colNumNow].BackColor != Color.Red)
{
resultPicBoxs[rowNumNow, colNumNow].BackColor = Color.Red;
colNumNow++;
}
nextColor = NextColor.yellow;
break;
case NextColor.yellow:
if (resultPicBoxs[rowNumNow, colNumNow].BackColor != Color.Yellow)
{
resultPicBoxs[rowNumNow, colNumNow].BackColor = Color.Yellow;
colNumNow++;
}
nextColor = NextColor.green;
break;
case NextColor.green:
if (resultPicBoxs[rowNumNow, colNumNow].BackColor != Color.Green)
{
resultPicBoxs[rowNumNow, colNumNow].BackColor = Color.Green;
colNumNow++;
}
nextColor = NextColor.red;
break;
}
if(colNumNow>=colNum)
{
rowNumNow++;
colNumNow = 0;
}
if(rowNumNow>=rowNum)
{
rowNumNow = 0;
colNumNow = 0;
}
}
}
三、效果展示
总结
以上实例实现了动态生成控件,并通过改变控件背景颜色实现跑马灯的效果。