【发布时间】:2018-08-20 17:42:56
【问题描述】:
我正在尝试用 c# 模拟 LED 显示板。我需要一个control,其中包含 1536 个可点击的controls 来模拟 LED(宽度为 96,高度为 16)。我为此使用了一个名为pnlContainer 的panel,用户将在运行时添加1536 个微小的自定义panels。这些定制的panels 应该在运行时通过点击事件改变它们的颜色。一切正常。但是将这个数量的微小panels 添加到容器中需要很长时间(大约 10 秒)。你对解决这个问题有什么建议?任何提示都表示赞赏。
这是我的客户panel:
public partial class LedPanel : Panel
{
public LedPanel()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (this.BackColor == Color.Black)
{
this.BackColor = Color.Red;
}
else
{
this.BackColor = Color.Black;
}
}
}
}
这是一段将微小的panels 添加到pnlContainer 的代码:
private void getPixels(Bitmap img2)
{
pnlContainer.Controls.Clear();
for (int i = 0; i < 96; i++)
{
for (int j = 0; j < 16; j++)
{
Custom_Controls.LedPanel led = new Custom_Controls.LedPanel();
led.Name = i.ToString() + j.ToString();
int lWidth = (int)(pnlContainer.Width / 96);
led.Left = i * lWidth;
led.Top = j * lWidth;
led.Width = led.Height = lWidth;
if (img2.GetPixel(i, j).R>numClear.Value)
{
led.BackColor = Color.Red;
}
else
{
led.BackColor = Color.Black;
}
led.BorderStyle = BorderStyle.FixedSingle;
pnlContainer.Controls.Add(led);
}
}
}
有没有更好的方法或更好的control 而不是panel来做到这一点?
【问题讨论】:
-
是的。任何事情都比向 Winforms 应用程序添加 1k+ 控件更好。我建议您在代码中完成所有操作,即对 Paint 事件和 MouseClcik 进行编码以完成所有需要的工作。还要创建一个数据结构,用于查找点击的位置以及在哪里绘制什么状态。也许是具有颜色或状态以及矩形或位置的类或元组.. - 另请注意,GetPixel 是一项缓慢的操作,因为它所做的比人们希望的要多得多。 Acceissng 你的数据结构会快很多,但是从图像加载总是需要一些时间,除非你使用 lockbit,这为时过早..
-
这个我也想过,但问题是我最后还是想提供一个黑点和红点的数组。如果我使用Paint,如何找到红点的数量和位置
-
你需要将数据存储在一些数据结构的二维数组中,也许只是布尔值。然后,您可以计算从索引中绘制什么的位置。附加优势:你很灵活 wrt 'led(pixel'-size..
-
如果您只想优化初始负载,也许您可以将面板添加到列表而不是控件集合中。当所有人都在那里时,您可以执行 panel.Controls.AddRange(theList.ToArray()),这将比 1k+ 单个 Adds 快很多..
-
类似这样的东西:Grid I can paint on? (VB.Net,但它是用 C# 编写的)在该示例中,没有控件,但每个单元格都可以在事件上发生。
标签: c# winforms performance runtime panel