职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 2982|回复: 4

Visual C++中实现双缓冲的基本原理

[复制链接]
一路顺风 发表于 2007-9-8 15:52 | 显示全部楼层 |阅读模式
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。

例如在OnDraw()函数中可以如下所述实现双缓冲,其主要步骤分为四步:

CPen Pen;

Pen.CreatePen(PS_INSIDEFRAME,1,RGB(225,225,0));

CBrush Brush;

Brush.CreateSolidBrush(RGB(225,225,0));

CDC dcMem;

CBitmap bm;

CRect rc;

GetClientRect(&rc);

// Step 1:为屏幕DC创建兼容的内存DC :CreateCompatibleDC()

dcMem.CreateCompatibleDC(pDC);

// Step 2:创建位图:CreateCompatibleBitmap()

bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

// Step 3:把位图选入设备环境:SelectObject(),可以理解为选择画布

dcMem.SelectObject(&bm);

dcMem.SelectObject(Pen);

dcMem.SelectObject(Brush);

dcMem.Ellipse(0,0,50,50);//画椭圆

// Step 4:把绘制好的图形“拷贝“到屏幕上:BitBlt()

pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

dcMem.DeleteDC();

bm.DeleteObject();

这样便实现了双缓冲,通过这个方法可以防止在VC中画图时出现屏幕闪烁的情况。
broken 发表于 2011-7-30 10:19 | 显示全部楼层
晕倒.......
能文能武 发表于 2011-8-9 10:43 | 显示全部楼层
我呆了.......
走失的猫咪 发表于 2011-8-9 10:43 | 显示全部楼层
刚才我还看见了呢.
醉倚西风 发表于 2011-8-11 14:22 | 显示全部楼层
没人点我啊~~
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-26 08:47 , Processed in 0.132894 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表