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

时间: 2024-08-26 17:00:24

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

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

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简

Win32下双缓冲绘图技术

一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢).打个简单的比方:有个画家在街边办了一个即时画展,在同一块画布上根据观众的要求画不同的图像,每当有一位观众制定要看什么画时,画家先把之前画布上的东西全部擦干净,再重新绘画.显然有一些经典的画像是大家都想看的,按照以前的老办法,画家每次都要重新画这幅图像,但这种擦了画,画了擦的方式很费时.所以画家想

Win32双缓冲画图原理

网上有许多文章讲述了如何使用Visual C++程序实现双缓冲,都是用C++面向对象语言写的,可能对很多没有接触过面向对象语言的C语言初学者来说理解起来有些困难,并且有些好心人也只是把源代码贴上去,不做注释,这就使读者读起来更费劲了.    在这里,我会就每一条语句作出解释.其中有一个地方比较有趣,值得讨论(见下文).好了,我们首先看一下双缓冲的基本原理: 一.双缓冲原理及图解 (1)定义设备描述表及位图句柄    HDC hMemDC;    HBITMAP hBitmap;(2)创建一个与窗

【转】双缓冲讲解及界面贴图

--------------------------------------------------------------------------- VC 驿站 WwW.CcTry.CoM 多抽出一分钟时间来学习,让你的生命更加精彩! C.C++.VC++ 各种学习资源,免费教程,期待您的加入! 动画教程只是起到技术交流的作用,请大家不用利用此方法做非法用途. 由此动画造成的任何后果和动画作者及本站无关. --------------------------------------------

【转】双缓冲(Double Buffer)原理和使用

原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249 一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和"消费者"供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见的例子: 例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失.这是由于"发送者"和&

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

一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见的例子: 例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失.这是由于“发送者”和“接收者”速度不一致所致,在他们之间安排一个或多个缓冲区来存放来不及接收的数据,让速度较慢的“接收者”可以慢慢地取完数据不至于丢失.  例2. 再如,计算机中的三级缓存结构:外存(硬

VC双缓冲绘图技术介绍

VC双缓冲绘图技术介绍 双缓冲绘图,它是一种基本的图形图像绘图技术.首先,它在内存中创建一个与屏幕绘图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到屏幕上.这种技术能够大大地提高绘图的速度,减少卡顿和闪屏的问题. 我们为什么要使用双缓冲技术来进行绘图? 在应用程序开发中,当图像信息数据量很大时,绘图可能需要几秒钟甚至更长的时间,这时,应用程序可能会出现卡顿的现象.另外,如果窗体在响应WM_PAINT消息的同时也要进行复杂的图形处理,那么窗体在重

MFC双缓冲绘图解决界面闪烁问题

一:为什么会产生界面闪烁? 解释这个之前,我们需要明白的是在MFC里面绘图的消息响应机制,大概的就是如果我们要在某一个 东西上面绘图,比如对话框,单文档等等,就必须先得到图形DC的句柄(handle),然后在指定句柄的基础上进行图形操作,也就是MFC常用的CDC *DC = this->getDC();其中的this就是你想画图的目标. MFC里在消息响应的过程中,WM_PAINT被转变为OnDraw()(单文档 Single Document)或是OnPaint()(对 话框Dialog)之类

位图操作和双缓冲机制

位图操作代码部分: CRect rect;  GetClientRect(rect);  pDC->SetMapMode(MM_ANISOTROPIC);  pDC->SetWindowExt(rect.Width(), rect.Height());  pDC->SetViewportExt(rect.Width(), -rect.Height());  pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2); CDC MemDC