最近在使用c#开发工业视觉软件时遇到一个需求,需要将每一个视觉处理结果图像显示在窗体中,并且视觉处理程序数量不定。要处理这种问题,一定要使用动态添加控件,下面是我的实现过程。
首先,行列数量的处理,我采用的是由列数控制行数,为什么这样做大家可以想想,或者试试使用行数控制列数会出现什么样的情况。
行数处理的时候需要采用对总控件数量开平方并向上取整的方法,这样在总数量为奇数时不至于导致控件显示不全,下面是我的代码分享。
复制
//C#批量动态添加控件实现瀑布流
//https://www.daimadog.org/10581.html
public void AddDynamicImageControlsToPanel(SplitContainer splitContainer, int controlCount)
{
int columnCount = (int)Math.Ceiling(Math.Sqrt(controlCount)); // 计算列数,向上取整
int rowCount = (int)Math.Ceiling((double)controlCount / columnCount); // 计算行数
splitContainer.Panel1.Controls.Clear(); // 清空Panel1中的所有控件
int controlIndex = 0;
int controlWidth = splitContainer.Panel1.Width / columnCount;
int controlHeight = splitContainer.Panel1.Height / rowCount;
for (int row = 0; row < rowCount; row++)
{
for (int column = 0; column < columnCount && controlIndex < controlCount; column++)
{
PictureBox pictureBox = new PictureBox();
pictureBox.Name = "dynamicPictureBox" + controlIndex;
pictureBox.Image = Image.FromFile("C:\\Users\\daimadog\\Desktop\\test.png"); // 替换为图片路径
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox.Width = controlWidth;
pictureBox.Height = controlHeight;
pictureBox.Top = row * controlHeight;
pictureBox.Left = column * controlWidth;
// 设置边框样式和颜色
pictureBox.BorderStyle = BorderStyle.FixedSingle;
pictureBox.BackColor = Color.White;
splitContainer.Panel1.Controls.Add(pictureBox);
controlIndex++;
}
}
}
注册容器大小改变和拆分器移动事件,以便在改变窗体大小以及拆分器移动时重绘
复制
private void splitContainer1_Resize(object sender, EventArgs e)
{
AddDynamicImageControlsToPanel(splitContainer1, 7);
}
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
AddDynamicImageControlsToPanel(splitContainer1, 7);
}
效果符合预期,这里我使用的splitContainer
控件,也可以换成其它的,自由发挥。
评论 (0)