相关参考资料:

GDI下实现双缓冲 - http://jingyan.baidu.com/article/e73e26c0f8df2424acb6a76e.html

<Win32_19>用双缓冲技术实现真个的平滑 - http://www.myexception.cn/program/1407847.html

设置双缓冲减少窗体闪烁 - http://hi.baidu.com/robinlxzh/item/ad70a4ae92db5bf614329be7

平时在窗体上不使用双缓冲来绘制的方法:

case WM_PAINT:

{

PAINTSTRUCT ps;

//为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。

HDC hdc = BeginPaint(hwnd, &ps);

//HPEN hPen = CreatePen(PS_SOLID, 1, RGB(128 , 128, 128)); //设置颜色

HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

SelectObject(hdc, hPen);

Rectangle(hdc, -1, -1, 680, 72); //画矩形

DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

//画线

hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

SelectObject(hdc, hPen);

MoveToEx(hdc, 0, 484, NULL); //起点

LineTo(hdc, 680, 484); //终点

DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

ReleaseDC(hwnd, hdc); //释放

EndPaint(hwnd, &ps); //结束缓制

return 0;

}

-----------------------------------------------------------------------------

下面使用双缓冲技术来画,与上面的代码对比,只需将原来的hdc -> hdc_old, 然后插入红色的两个部分就实现双缓冲绘图。

WM_ERASEBKGND 与 WM_PAINT 的结合:

case WM_ERASEBKGND:

{

return 1; //避免窗口背景的重刷 - http://hi.baidu.com/robinlxzh/item/ad70a4ae92db5bf614329be7

}

case WM_PAINT:

{

PAINTSTRUCT ps;

//使用双缓冲技术绘图

//变量: hdc_old 表示系统默认的 hdc

//变量: hdc 表示双缓冲的内存DC

//为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。

HDC hdc_old = BeginPaint(hwnd, &ps);

//用于缓冲的内存DC

HDC hdc = CreateCompatibleDC(hdc_old);

//需要获取窗口的宽与高, 缓制尺寸

RECT clientRect;

GetClientRect(hwnd,&clientRect);

//printf("width:%d, height:%d\n",clientRect.right,clientRect.bottom);

//创建内存兼容位图hBmp

HBITMAP hBmp = CreateCompatibleBitmap(hdc_old,clientRect.right,clientRect.bottom);

//将内存位图选入缓冲内存DC中——以便可以绘制多个位图

SelectObject(hdc,hBmp);

//如果不执行这两步, 窗口显示出来会出现黑色背景

SelectObject(hdc, GetSysColorBrush(COLOR_3DFACE)); //设置刷子颜色 - Rectangle()的填充色

//由于 Rectangle() 画出有黑色边框线, 这里故意从 -1,-1 绘制 +2, +2, 这样黑色边框线超出可视范围,就看不到了

Rectangle(hdc, -1, -1, clientRect.right + 2, clientRect.bottom + 2); //画窗体的整个背景

//HPEN hPen = CreatePen(PS_SOLID, 1, RGB(128 , 128, 128)); //设置颜色

HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

SelectObject(hdc, hPen);

Rectangle(hdc, -1, -1, 680, 72); //画矩形

DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

//画线

hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); //按钮的3D阴影

SelectObject(hdc, hPen);

MoveToEx(hdc, 0, 484, NULL); //起点

LineTo(hdc, 680, 484); //终点

DeleteObject(hPen); //一旦不再需要画笔,记得用DeleteObject函数将其删除

// 将内存中的内容显示到窗口 - 使用bitblt函数

BitBlt(hdc_old,0,0,clientRect.right,clientRect.bottom,hdc,0,0,SRCCOPY);

//注意回收内存资源

DeleteObject(hBmp);

DeleteDC(hdc);

ReleaseDC(hwnd, hdc); //释放

EndPaint(hwnd, &ps); //结束缓制

return 0;

}

2014-07-03

win32: WM_PAINT 实现双缓冲缓图的更多相关文章

  1. win32下的双缓冲绘图技术

    一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...

  2. MFC双缓冲解决图象闪烁[转]

    转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...

  3. 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口

    印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...

  4. Win32 GDI 非矩形区域剪裁,双缓冲技术

    传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...

  5. Win32下双缓冲绘图技术

    一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...

  6. Win32双缓冲画图原理

    网上有许多文章讲述了如何使用Visual C++程序实现双缓冲,都是用C++面向对象语言写的,可能对很多没有接触过面向对象语言的C语言初学者来说理解起来有些困难,并且有些好心人也只是把源代码贴上去,不 ...

  7. Win32双缓冲讲解

    双缓冲是一种思想,也是一种方法,它可以避免频繁的闪烁问题.如果在画布上直接绘画,由于每次都会重新擦除然后重绘,绘制需要时间,所以肉眼会看到闪烁问题.解决的方法就是在内存中先创建出一个内存dc,然后在内 ...

  8. 双缓冲(Double Buffer)原理和使用

    转自双缓冲(Double Buffer)原理和使用 一.双缓冲作用            双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和& ...

  9. c++双缓冲技术,以避免闪烁绘图

    当数据量非常大时,画图可能须要几秒钟甚至更长的时间,并且有时还会出现闪烁现象,为了解决这些问题.可採用双缓冲技术来画图. 双缓冲即在内存中创建一个与屏幕画图区域一致的对象,先将图形绘制到内存中的这个对 ...

随机推荐

  1. prometheus和metrucs-server (k8s监控)

    资源指标:metrucs-server 自定义指标:prometheus, k8s-prometheus-adapter(转换prometheus数据的格式) 新一代架构: 核心指标流水线:由kube ...

  2. Windows7 (Win7) 配置Windows Update 时失败 正在还原更改

    用WinPE启动后,进入Windows\WinSxS目录,想办法删掉pending.xml和reboot.xml

  3. Hibernate最佳实战

    1:一对一,一对多,多对多双向管理必设mappedBy ,将关系交给乙方维护,不然的话会在双方都建立关系,比如一对一双向的时候双方都会保存对方的id外键管理 具体在项目中采用双向还是单项看实际情况. ...

  4. 今日头条移动app广告激活数据API对接完整Java代码实现供大家参考》》》项目随记

    这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我们需要对广告的激活数据进行一个检测,跟 ...

  5. jQuery代码优化的9种方法

    前面的话 本文将详细介绍jQuery代码优化的9种方法 用对选择器 在jQuery中,可以用多种选择器,选择同一个网页元素.每种选择器的性能是不一样的,应该了解它们的性能差异 1.最快的选择器:id选 ...

  6. 将数组Arrays转成集合List

    String[] split = pids.split("-"); //将数组split转成集合 List<String> asList = Arrays.asList ...

  7. c++ 怎么输出保留2位小数的浮点数

    //添加头文件 #include<iomanip> //定义变量 folat a=9.1; cout<<setiosflags(ios::fixed)<<setpr ...

  8. hdu-2255(带权二分图)

    题解:板子题.... #include<iostream> #include<cstring> #include<cstdio> #include<queue ...

  9. BZOJ5119 生成树计数(prufer+生成函数+分治FFT+多项式exp)

    https://www.luogu.org/problemnew/solution/P4002 神树的题解写的很清楚了.稍微补充: 1.[x^i]ln(A(ax))=a^i[x^i]ln(A(x)), ...

  10. Git——快速重命名文件和查看commit提交版本【四】

    快速重命名文件 $ git mv README.md readme.md 使用git mv命令后直接commit即可,不再需要进行add或rm操作 查看版本历史 所有的参数都可以进行组合使用的,比如我 ...