• GDI+ 绘图闪烁解决方法


    闲着没事,准备做一个类似于TeeChart的自定义控件,结果第一步的绘图就把我给难倒了,虽然早就知道GDI绘图的闪烁问题很坑,但是却没有想到如此之坑,折腾了两天,才找到解决方法。

    首先在窗体加载的时候,加入双缓存,说实话以前一直没觉得这个双缓存有什么用,不过这次总算是有了点儿效果。

    DoubleBuffered = true;
    SetStyle(ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.ResizeRedraw |
                ControlStyles.AllPaintingInWmPaint, true);    

    下面是一个例子,我准备画一个简单的坐标系。这个方法会获得一个自定义的位图,将这个位图直接赋值给窗体的背景图片,或者PictureBox控件也可以。

            /// <summary>
            /// 绘制界面
            /// </summary>
            private Bitmap DrawGDI()
            {
                var bmp = new Bitmap(Width, Height);
                var pen = new Pen(Color.Black, 1.0f);
                Graphics g = Graphics.FromImage(bmp);
                var p1 = new Point(20, 10);
                var p2 = new Point(20, Height - 25);
                var p3 = new Point(Width - 10, Height - 25);
                g.DrawLines(pen, new[] { p1, p2, p3 });
                g.DrawString("0", Font, Brushes.Black, 10, Height - 20);
                return bmp;
            }

    我这里是直接在重绘方法里面给背景图片直接赋值了。

            /// <summary>
            /// 重绘 
            /// </summary>
            protected override void OnPaint(PaintEventArgs e)
            {
                BackgroundImage = DrawGDI();
                base.OnPaint(e);
            }

    做完这些之后,我惊讶的发现GDI绘制出的图居然不闪了。当然了,这个方法的可移植性还不太清楚,欢迎大家讨论。

  • 相关阅读:
    Linux压缩和解压类指令
    Linux 搜索查找类指令
    Linux时间日期类指令
    Linux文件目录类指令
    Linux帮助指令
    Linux运行级别
    微信授权获取code/openid
    微信公众配置
    MySQL规范
    PHP7搭建项目遇到的坑
  • 原文地址:https://www.cnblogs.com/rogation/p/3708473.html
Copyright © 2020-2023  润新知