C#解决在窗体控件中(panel)画图闪烁和抖动问题

解决双缓冲的关键技术:

1、设置显示图元控件的几个属性: 必须要设置,否则效果不是很明显!

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

2、窗口刷新一次的过程中,让所有图元同时显示到窗口。

    可以通过以下方式实现,这种方式涉及到Graphics对象的创建方式。

Graphics对象的创建方式:

a、在内存上创建一块和显示控件相同大小的画布,在这块画布上创建Graphics对象。接着所有的图元都在这块画布上绘制,绘制完成以后再使用该画布覆盖显示控件的背景,从而达到“显示一次仅刷新一次”的效果!

实现代码(在panel_Paint方法中):

private Int16 point_x = 50, point_y = 50;  
int j = 0;

private void panel_Paint(object sender, PaintEventArgs e)
{
    Bitmap bMap= new Bitmap(panel.Width, panel.Height);
    Graphics g = Graphics.FromImage(bMap);

    g.Clear(this.BackColor);
    g.SmoothingMode = SmoothingMode.HighQuality; //高质量
    g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量

    g.DrawEllipse(Pens.Blue, point_x, point_y, 8, 8);
    g.FillEllipse(new SolidBrush(Color.Blue), point_x, point_y, 8, 8);
    if (j % 2 == 0)
    {
         point_x = (short)(point_x + 1);
         point_y = (short)(point_y + 1);
    }

    j++;
    txtX.Text = (point_x + 10).ToString();
    txtY.Text = (point_y + 10).ToString();

    using (Graphics tg = e.Graphics)
    {
        tg.DrawImage(bMap, 0, 0);  //把画布贴到画面上
    }
}

WildCard | 一分钟注册,轻松订阅海外软件服务    

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值