GDI双缓冲】的更多相关文章

我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不清不楚的,折腾了一晚上也没弄出来.第二天觉定自己研究一下.现在把自己的一些想法拿出来跟大家分享一下. 双缓冲的基本原理:(转) 一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的.    .net 1.1中,使用:this.SetStyle(ControlStyles…
GDI双缓冲 翻译自Double buffering,原作者Dim_Yimma_H 语言:C (原文写的是C++,实际上是纯C) 推荐知识: 构建程序 函数 结构体 变量和条件语句 switch语句 循环 指针 创建窗口 教程 为了构建这个应用,你需要链接这两个库:User32.lib, Gdi32.lib. 你也需要把开发环境中的字符集设定为多字节,因为如果字符集是Unicode的话,MessageBox和CreateWindow都会有不同的定义.如果你在用Visual C++ 2005,你可…
双缓冲在GDI+里可以有效的提高描画效率.改善显示的质量. 下面的代码是一个最简单的双缓冲的模板.可以根据需要,做简单的修改即可. Bitmap CacheImage( [Width], [Height] );      Graphics CacheGraphics( &CacheImage );       // 对CacheImage进行描画      // ......            // 获得窗口的Graphics对象      Graphics Graphic( [ Windo…
为什么要使用双缓冲绘制 在进行多图元绘制的时候: 因为是要一个一个画上去,所以每画一个图元,系统就要做一次图形的绘制操作,图形的重绘是很占用资源的,特别当需要重绘的图形数量很多的时候,所造成的消耗就特别大,导致闪烁,不流畅等情况.那么如何来解决这个问题呢? 那就是双缓冲. 它的基本原理就是 先在内存中开辟一块虚拟画布,然后将所有需要画的图元一个个先画在这块“虚拟画布”上,最后在一次性将整块“虚拟画布”画到真正的窗体上.因为所有的单个图形的绘制都不是真正的调用显示系统来“画”,所以不会占用显示系统…
有时候在窗体中执行不断的GDI+操作的时候会出现闪速的状况,除了修改窗体的参数,更应该解决刷新本身的问题,双缓冲可能就是这样来的. 方法1: 用GDI绘制在位图上,然后再重新生成位图 Bitmap bt = , ); Graphics g = Graphics.FromImage(bt); g.DrawEllipse(Pens.Red, , , , ), ); g.Dispose(); gb.DrawImage(bt,,); gb.Dispose();…
早前曾为此问题在CSDN发帖求助(GDI+ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方法,虽然绘制效果比直接绘制要好一些,不过还不能跟GDI的双缓冲方式比肩.   现在,我终于找到了一个理想的实现方式,效果与GDI的实现不相上下,代码如下:   /*C++ code*/ RECT rc; GetClientRect(g_hwnd,&rc); Bitmap bmp(int(rc.right),int(rc.bottom));   Graphics bmpGraphics(&bm…
一.简介 在进行复杂图形绘制时,若直接在屏幕DC上进行绘制,则会出现明显的闪烁.闪烁产生的原因是当绘制的图形较为 复杂时,图形绘制过程中就被刷新到屏幕上,导致结果断断续续地显示出来.双缓冲绘图的原理是在另开辟一块内存用于绘制,当所有绘制工作完成后将内存数据一 次性拷贝到屏幕上. 双缓冲绘图步骤: 创建兼容DC(CreateCompatibleDC) 创建兼容位图(CreateCompatibleBitmap) 将兼容位图选入兼容DC(SelectObject) 在兼容DC中进行绘制工作 将兼容D…
在OnDraw(CDC* pDC) 中添加如下代码 CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上) MemBit…
只是记录自己的UI库,对其他估计没什么帮助 void CListCtrlUI::ReFillRect(HDC hdc){ if (!m_pImage) { Graphics gs(hdc); int strollBarW = m_pVScrollBar->GetWindowWidth(); m_memDrawSize.cy = m_header.GetHeight() + GetRowCount()*m_rowHeight; m_pImage = new Bitmap(m_rect.GetWid…
前言: 闪烁问题,之前的经验是使用双缓冲,借此机会,把双缓冲的研究心得总结下. 双缓冲的含义: 缓冲这个词,相信大家都不陌生,Cache.主要是为了解决上下游(或者模块.或者系统)等性能不匹配问题.如果把上游看成"生产者",下游看成"消费者",当"生产者"与"消费者"的处理速度不同时,为了避免干等,中间会加一些缓冲区. 无缓冲,双方都容易阻塞. 最常用的生产者-消费者模型,增加弹性缓冲,缺点是每生产+每消费都需要加锁 双缓冲,…
转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html_______________________________________________________________________ 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题.而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案.MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要…
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1  绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示.刷新过程中会导致所有图元重新绘制, 而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次.窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口, 因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪…
传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简…
在使用gdi技术画图时,有时会发现图形线条不够流畅,或者在改变窗口大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!)                                                                                                                                                                              …
这里只是在遇到实际问题的时候提出的一种解决方法,用以处理闪屏问题. 首先要做的是对GDI的一个设置问题: 在应用程序类中添加一个保护权限数据成员 class C...App: {... private: ULONG_PTR m_gdiplusToken; } 在相应的cpp文件中,添加头文件.之所以把头文件放到cpp文件中是为了防止过多的引用 #include <Gidplus.h> 然后再应用程序类的初始函数和退出函数进行修改: BOOL C...App::InitInstance() {…
双缓冲绘图分析  1.Windows 绘图原理  我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔.画刷等,就相当于彩色粉笔了.我们在黑板上手工画图时,是一笔一划的,电脑亦然.只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的. 2.普通绘图方式的局限  上述绘图方式我们暂且称之为普通绘图方式吧.虽然这种方式能满足相当一部分的绘图需要,…
1.输出文本 // 输出文本 ,,)); //设置字体颜色,但最后都要返回原来的字体格式 COLORREF clrBackColor = SetBkColor(hDC, RGB(,,)); //设置背景颜色,仅仅指的是文本区域的颜色 HFONT hFont = CreateFont( // nHeight //创造一个字体格式,其中包含14个参数,前两个是字体的大小,其他的详见MSDN , // nWidth , // nEscapement , // nOrientation , // nWe…
private void button1_Click(object sender, EventArgs e) { Bitmap bmp = new Bitmap(this.picturebox.Width, this.picturebox.Height); //在内存中创建一个bmp图,bmp的大小和窗口中picturebox的大小相同    Graphics g = Graphics.FromImage(bmp); //通过内存中的bmp图像创建一个在内存中的画布g,那么在画布上的任何操作就都…
C#绘图双缓冲 C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等用户画完之后再输出就不会出现这种情况,具体的做法,其实也就是先创建一个位图对象,然后把内容保存在里面,最后把图呈现出来. GDI+的双缓冲问题 一直以来的误区:.net1. 和 .net 2.0 在处理控件双缓冲上是有区别的. .net 1.1 中,使用:this.S…
本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5&mod=personinfo 在前几节的笔记里,大家肯定会为一个问题感到心烦:画面怎么老是一闪一闪的啊,太难受了.确实是的,如果玩这样的游戏简直就是一种折磨.但是大家玩游戏的时候,从来没有遇到过这种情…
“木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/ WGF(windows graphic foundation)为windows下的gdi和gdiplus双缓冲绘图框架.框架在VC6.0下使用C++语言开发而成并以可扩展的MFC动态链接库形式提供,适用于windows操作系统.WGF为完全开源的免费产品,可以用于任何商业的和非商业的用途. WGF设计的目的是对windows下的gdi和gdiplus双缓冲绘图进行封装和优化…
1.要求 在界面加载本地图片并显示,每过100ms改变一张图片显示 2.现象 通过定时器控制CImage,Load,Draw,Destroy,会非常的卡顿.因为Load图片时,会是非常大的数据[所有CImage最好定义在堆上,栈上可能会因为数据过大软件异常],需要阻塞一定的时间. 3.解决原理 其实界面绘图是一个很快的过程,不管图像多复杂,都是一个屏幕高x屏幕宽的像素点.而加载图片是需要时间的,打开文件,开辟空间,读取数据,等等.所以可以将耗时操作放在线程里,这就是传说中的双缓冲绘图:在线程里读…
相关参考资料: GDI下实现双缓冲 - http://jingyan.baidu.com/article/e73e26c0f8df2424acb6a76e.html <Win32_19>用双缓冲技术实现真个的平滑 - http://www.myexception.cn/program/1407847.html 设置双缓冲减少窗体闪烁 - http://hi.baidu.com/robinlxzh/item/ad70a4ae92db5bf614329be7 平时在窗体上不使用双缓冲来绘制的方法:…
一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinForm GDI 编程基本原理 二 本节内容---画墙(砖块集合)以及双缓冲实现 1.界面截图如下: 三 砖块类设计 砖块类的定义代码和之前的挡板类差不多,代码如下: public class CommonBrick : GameObject { public Rectangle m_Rect { get…
VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 VC++ 2009-12-06 21:32:24 阅读1042 评论1  字号:大中小 订阅 *******************************************************************例子*********************************…
双缓冲画图,它是一种主要的图形图像画图技术.首先,它在内存中创建一个与屏幕画图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到屏幕上. 这样的技术能够大大地提高画图的速度,降低卡顿和闪屏的问题. Tip: 去看看吧.1. 我们为什么要使用双缓冲技术来进行画图?     在应用程序开发中,当图像信息数据量非常大时.画图可能须要几秒钟甚至更长的时间,这时.应用程序可能会出现卡顿的现象.另外,假设窗体在响应WM_PAINT消息的同一时候也要进行复杂的图…
C#双缓冲解释 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕 C#双缓冲 上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉害,因为后台一直在刷新,而如果等用户画完之后再输出就不会出现这种情况,具体的做法,其实也就是先创建一个位图对象,然后把内容保存在里面,最后把图呈现出来. GDI+的双缓冲问题 一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的. .net 1.1 中,使用:this.Se…
转自:http://blog.csdn.net/foreverhuylee/article/details/21548107 当然你可以直接搜索到能用的代码,并且基本能满足要求.不过这样总不是学习的态度.本着学习分享的态度,现做一些基本的分析吧. 在MSDN上知道,我们画图的对象都是窗口的DC,WINDOWS的绘图更新时,总是用背景色先填充这个区域,然后才是我们的绘图代码, 这就是说,如果我们绘图的代码与背景色差别较大,不管我们更新速度多快,总会有种闪烁的感觉. 要想避免,通常的做法都是双缓冲了…
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形"拷贝"到另一块黑板(屏幕)上.采取这种方法可以提高绘图速度,极大的改善绘图效果. 例如在OnDraw()函数中可以如下所述实现双缓冲,其主要步骤分为四步: CPen Pen; Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0)); CBru…
实习生活告一段落,我正式从一名.NET程序员转入Java阵营,不得不说刚开始用Java的东西是多么的不习惯,但是经过三个月的使用与开发,我也发现了Java的优势:不在于语言,而在于开源.这意味着有更多免费可用的东西,直接复用,但是研究它的人也可以通过代码深造自己的技术水平. 题外话说到这吧,很简单的一个问题,读取一个大型文件(可能超过内存),分析其中英文单词的词频,并输出结果.简化起见,我们假定编码不是Unicode,而是UTF-8或者ANSI,最快速度,榨干磁盘IO是关键所在. 1.最开始 一…