闲着没事,准备做一个类似于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(, );
var p2 = new Point(, Height - );
var p3 = new Point(Width - , Height - );
g.DrawLines(pen, new[] { p1, p2, p3 });
g.DrawString("", Font, Brushes.Black, , Height - );
return bmp;
}

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

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

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

GDI+ 绘图闪烁解决方法的更多相关文章

  1. 【Visual C++】Windows GDI贴图闪烁解决方法

    一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的 ...

  2. C# Winform频繁刷新导致界面闪烁解决方法

    C#Winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供的默认双缓冲将 ...

  3. winform频繁刷新导致界面闪烁解决方法

    转自龙心文 原文 winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供 ...

  4. 在ios端点击按钮闪烁解决方法(小tips)

    在ios端,safari浏览器上触发click事件有300ms的延迟响应,为touch添加的样式会和click冲突而出现闪烁问题 在safari中触摸事件的相应顺序如下: touchstart --& ...

  5. c# winform窗体闪烁解决方法

    在主窗体中任意位置加上下面的代码即可 protected override CreateParams CreateParams { get { CreateParams cp = base.Creat ...

  6. 使用js弹出div刷新时闪烁解决方法

    <div style="visibility: hidden"> //弹出div内容 </div>

  7. ddraw 视频下绘图 不闪烁的方法

    我们假设是在在RGB视频上绘图(直线,矩形等),一般採用双缓冲区继续,使用内存MemoryDC,来实现画的图形在视频上显示不闪烁的功能,可是我们知道用RGB显示视频都是使用GDI进行渲染,这样非常耗C ...

  8. VC使用双缓冲避免绘图闪烁的正确使用方法【转】

    使用内存DC绘图,然后实现双缓冲,避免绘图闪烁,这个小技术简单但很有效.但是仍然有很多人说使用了双缓冲,图片却仍然有闪烁,分析了几个这样的例子,发现 其实不是双缓冲的技术问题,而是使用者没有正确理解和 ...

  9. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

随机推荐

  1. SSH框架整合面试题

    1. 谈谈你mvc的理解MVC是Model-View-Controler的简称.即模型-视图-控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC中的模型.视图.控制器它们 ...

  2. 初始tornado框架

    2.7版本的一个简单的框架 from wsgiref.simple_server import make_server def new(): return 'new' def index(): ret ...

  3. C++/CLR Sqlite初探

        error C2491: "acosh": 不允许 dllimport 函数 的定义     asinh": 不允许 dllimport 函数 的定义     a ...

  4. struts2.1笔记05:struts2开发环境的搭建

    1.找到开发Struts应用需要使用到的jar文件. 首先我们要在myEclipse中新建一个Web Project,我们这里命名为"struts2".然后我们就要使用jar文件, ...

  5. Android 自学之选项卡TabHost

    选项卡(TabHost)是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组建摆放区域.通过这种方式,就可以在一个容器中放置更多组件 ...

  6. Yii2高级版本复制新项目出现问题解决(转)

    引用于 http://www.linuxidc.com/Linux/2015-02/114116.htm Yii2高级版本复制新项目会遇到下面的报错信息: exception 'yii\base\In ...

  7. FTP服务详解

    FTP服务 本章机构 简介 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文件传输协议".用于Internet上的控制文件的双向传输.同时, ...

  8. Express 4.x Node.js的Web框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3821150.html ...

  9. 关于Eclipse生成和导入Patch文件.

    & 生成的文件如下: 如果系统对这个patch文件有识别的话是一个带有问号的icon文件. diff --git a/main/plugins/org.talend.designer.core ...

  10. 关于cmd模式下切换目录

    cmd下切换目录: 经常犯下的错误一: 在默认路径下输入 cd D: 想切换到D盘但是会出现上面的现象. 正确的的做法是直接输入要转移到的盘符: D:  就可以了. 在这种情况下再输入cd D: