GDI+ 绘图闪烁解决方法

本文介绍了一种解决GDI绘图闪烁的方法,通过设置窗体的双缓存属性并利用Graphics对象从自定义位图中绘制线条,最终实现了绘图过程中的无闪烁效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲着没事,准备做一个类似于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绘制出的图居然不闪了。当然了,这个方法的可移植性还不太清楚,欢迎大家讨论。

转载于:https://www.cnblogs.com/rogation/p/3708473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值