这也许不是你要找的答案,但我认为它是一个有趣的替代方案。与其必须从每次更改中向上绘制所有图层,我通过将多个
PictureBox
嵌套到一个底部的
PictureBox pBox0
中来堆叠尽可能多的图层。
List<PictureBox> Layers = new List<PictureBox>();
private void Form1_Load(object sender, EventArgs e)
{
Layers.Add(pBox0);
setUpLayers(pBox0 , 20);
timer1.Start();
}
这段话的意思是:“堆叠设置如下:”。其中,“html”是一种标记语言,用于创建网页。
void setUpLayers(Control parent, int count)
}
为了获得最佳性能,我使用
Format32bppPArgb
作为像素格式。
为了测试,我运行一个
Tick
事件,随机绘制到一个图层上:
Random R = new Random(9);
private void timer1_Tick(object sender, EventArgs e)
{
int l = R.Next(Layers.Count-1) + 1;
Bitmap bmp = (Bitmap) Layers[l].Image;
using (Graphics G = Graphics.FromImage(Layers[l].Image))
{
G.Clear(Color.Transparent);
using (Font font = new Font("Consolas", 33f))
G.DrawString(l + " " + DateTime.Now.Second , font, Brushes.Gold,
R.Next(bmp.Size.Width), R.Next(bmp.Size.Height));
}
Layers[l].Image = bmp;
}
要将所有图层合并为一个位图,您可以使用DrawToBitmap
方法:
Bitmap GetComposite(Control ctl)
结果可以保存或以任何其他方式使用。
请注意,通过这种方式创建太多的层会达到窗口句柄的限制;我在约90个层时达到了该限制。如果您需要更多的层,需要采用更复杂的缓存策略。