win32: WM_PAINT 实现双缓冲缓图
相关参考资料:
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 实现双缓冲缓图的更多相关文章
- win32下的双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- MFC双缓冲解决图象闪烁[转]
转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...
- 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口
印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...
- Win32 GDI 非矩形区域剪裁,双缓冲技术
传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X- ...
- Win32下双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- Win32双缓冲画图原理
网上有许多文章讲述了如何使用Visual C++程序实现双缓冲,都是用C++面向对象语言写的,可能对很多没有接触过面向对象语言的C语言初学者来说理解起来有些困难,并且有些好心人也只是把源代码贴上去,不 ...
- Win32双缓冲讲解
双缓冲是一种思想,也是一种方法,它可以避免频繁的闪烁问题.如果在画布上直接绘画,由于每次都会重新擦除然后重绘,绘制需要时间,所以肉眼会看到闪烁问题.解决的方法就是在内存中先创建出一个内存dc,然后在内 ...
- 双缓冲(Double Buffer)原理和使用
转自双缓冲(Double Buffer)原理和使用 一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和& ...
- c++双缓冲技术,以避免闪烁绘图
当数据量非常大时,画图可能须要几秒钟甚至更长的时间,并且有时还会出现闪烁现象,为了解决这些问题.可採用双缓冲技术来画图. 双缓冲即在内存中创建一个与屏幕画图区域一致的对象,先将图形绘制到内存中的这个对 ...
随机推荐
- liunx 运维知识一部分
一 克隆虚拟机 大家都需要做的克隆虚拟机,在克隆虚拟机之前,需要把网卡源的UUID和Mac地址全部删除掉.不然相同会冲突使用不了. 删除UUID跟Mac的操作步骤如下: cd /etc/sysc ...
- 在浏览器上安装 Vue Devtools工具
Vue.js devtools是基于google chrome浏览器的一款调试vue.js应用的开发者浏览器扩展,可以在浏览器开发者工具下调试代码. 1)首先在github下载devtools源码,地 ...
- iview render bug & vue namespace bug
iview render bug https://codepen.io/xgqfrms/pen/gyGjKP https://codepen.io/xgqfrms/full/gyGjKP bug &l ...
- python数据结构与算法第十二天【快速排序】
1. 原理如图所示: 2.代码实现 def quick_sort(alist, start, end): """快速排序""" # 递归的退 ...
- Java多线程之静态代理
package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...
- 学习 Spring (七) Resource
Spring入门篇 学习笔记 Resource: Spring 针对资源文件的统一接口 UrlResource: URL 对应的资源,根据一个 URL 地址即可构建 ClassPathResource ...
- codeforces231C
To Add or Not to Add CodeForces - 231C A piece of paper contains an array of n integers a1, a2, ..., ...
- iPhone
电报交流***vpnpay app不能用了,只要能下载就可以用,谨慎卸载 升级.网络链接不成功的,多试几次,毕竟程序不会运行你的错误操作 ,重新添加链接服务器,继续搞!耐心的进行下面操作即可链接,如有 ...
- windows 动态库的封装以及调用
1.一个程序从源文件编译生成可执行文件的步骤:预编译 --> 编译 --> 汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开.处 ...
- .net core 2.0 配置Session
本文章为原创文章,转载请注明出处 配置Session 在Startup.cs文件的ConfigureServices方法中添加session services.AddSession(); 在Start ...