在Panel C#上绘制大量图像仍然很慢并且闪烁

时间:2014-09-15 20:16:48

标签: c# doublebuffered onpaint

我正在尝试创建一个能够分析DNA数据并可视化与DNA参考序列相比的差异的程序。这涉及我希望在面板上绘制的大量字母,每个基底(A,C,G,T)具有不同的背景颜色。所以水平线代表一条DNA线。

到目前为止,我已将此作为测试:

创建位图

    Bitmap bit;

    public Form1()
    {
        InitializeComponent();

        bit = new Bitmap(15, 15);
        Graphics g = Graphics.FromImage(bit);
        g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(1, 1, 13, 13));
        g.Dispose();
    }

这是我正在使用的Panel的Onpaint处理程序:

    private void p_Paint(object sender, PaintEventArgs e)
    {
        int x_Start = e.ClipRectangle.X;
        int x_Length = e.ClipRectangle.Width;
        int y_Start = e.ClipRectangle.Y;
        int y_Length = e.ClipRectangle.Height;

        Bitmap insb = new Bitmap(RoundUp(x_Length), RoundUp(y_Length));
        Panel p = (Panel)sender;

        Graphics g = p.CreateGraphics();
        Graphics bmp = Graphics.FromImage(insb);

        for (int y = 0; y < insb.Height; y += 15)
        {
            for (int x = 0; x < insb.Width; x += 15)
            {
                bmp.DrawImage(bit, x, y);
            }
        }
        g.DrawImage(insb, x_Start, y_Start);
        bmp.Dispose();
        g.Dispose();
   }

这会创建一个正方形网格,但是当我滚动它时,它会像疯了一样闪烁......

我已将Panel的Doublebuffered属性设置为true,如下所示:

        typeof(Panel).InvokeMember("DoubleBuffered",
        BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
        null, listHolder.Controls[0], new object[] { true });

这稍微改善了,但距离我想要的还有很远。我究竟做错了什么? (这也是我的第一篇文章,所以要温柔一点;))

1 个答案:

答案 0 :(得分:0)

找到答案:整个双缓冲无法正常工作。最后我将其添加到表单加载中:

System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
aProp.SetValue(canvas, true, null);

我将此添加到我的表单构造函数

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();

在这个画布中,我画了所有的东西......感谢所有的帮助!