MFC 双缓冲 绘图实例
2016-11-07 15:22
246 查看
本文用极其简单的mfc对话框程序,通俗易懂的讲解了双缓存技术。总共八步,按照操作,每一个新手都可以从这个简单的实例中开始学习双缓存绘图。
————————————————————————————————————————————开始
其实,双缓冲只是名字叫的好听罢了,总体也没什么技术含量,在这里举个小例子就可以了:
利用双缓冲绘图与普通绘图的差距
大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板;
①普通绘图就是直接在我们看得到的黑板上绘图
②双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;
利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。
——————————————————————开始
第一步:新建一个对话框工程
第二步:添加两个按钮:
一个命名为 双缓冲绘图;
一个命名为 普通绘图;
第三步:声明变量:
在CMyDlg类上右击添加变量如下:
CDC MyDC;
CBitmap bmp;
CBitmap *oldbmp;
首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)
第四步:在OnInitDialog()函数中添加以下代码:
//窗口DC
CDC *dc=GetDC();
//创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp )
MyDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc,200,200);
//把内存位图选进内存DC中用来保存在内存DC中绘制的图形
oldbmp=MyDC.SelectObject(&bmp);
//在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点)
for(int i=0;i<200;i+=6)
for(int j=0;j<200;j+=6)
MyDC.Ellipse(i-3,j-3,i+3,j+3);
第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:
MyDC.SelectObject(oldbmp);
bmp.DeleteObject();
MyDC.DeleteDC();
//选进原来的位图,删除内存位图对象和内存DC
第六步:双击 ”双缓冲“按钮添加以下代码:
GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY);
//把内存DC中的图形粘贴到窗口中;
第七步:双击“普通绘图”按钮添加以下代码:
for(int i=0;i<200;i+=6)
for(int j=0;j<200;j+=6)
GetDC()->Ellipse(i-3,j-3,i+3,j+3);
//按普通方式在窗口中绘制和在内存DC中一样数量和大小的位图;
第八步:运行程序............................
先单击 普通绘图 按钮,大家可以看到绘图的速度有点慢
再单击 双缓冲绘图 按钮,图像马上就显示出来了,
这就是双缓冲和普通绘图的区别了
工程源代码及exe下载地址:http://download.csdn.net/detail/i_likechard/9676667
程序运行结果:重点是点击普通绘图与双缓存绘图时能明显感觉到绘制速度的快慢。
————————————————————————————————————————————开始
其实,双缓冲只是名字叫的好听罢了,总体也没什么技术含量,在这里举个小例子就可以了:
利用双缓冲绘图与普通绘图的差距
大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板;
①普通绘图就是直接在我们看得到的黑板上绘图
②双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;
利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。
——————————————————————开始
第一步:新建一个对话框工程
第二步:添加两个按钮:
一个命名为 双缓冲绘图;
一个命名为 普通绘图;
第三步:声明变量:
在CMyDlg类上右击添加变量如下:
CDC MyDC;
CBitmap bmp;
CBitmap *oldbmp;
首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)
第四步:在OnInitDialog()函数中添加以下代码:
//窗口DC
CDC *dc=GetDC();
//创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp )
MyDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc,200,200);
//把内存位图选进内存DC中用来保存在内存DC中绘制的图形
oldbmp=MyDC.SelectObject(&bmp);
//在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点)
for(int i=0;i<200;i+=6)
for(int j=0;j<200;j+=6)
MyDC.Ellipse(i-3,j-3,i+3,j+3);
第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:
MyDC.SelectObject(oldbmp);
bmp.DeleteObject();
MyDC.DeleteDC();
//选进原来的位图,删除内存位图对象和内存DC
第六步:双击 ”双缓冲“按钮添加以下代码:
GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY);
//把内存DC中的图形粘贴到窗口中;
第七步:双击“普通绘图”按钮添加以下代码:
for(int i=0;i<200;i+=6)
for(int j=0;j<200;j+=6)
GetDC()->Ellipse(i-3,j-3,i+3,j+3);
//按普通方式在窗口中绘制和在内存DC中一样数量和大小的位图;
第八步:运行程序............................
先单击 普通绘图 按钮,大家可以看到绘图的速度有点慢
再单击 双缓冲绘图 按钮,图像马上就显示出来了,
这就是双缓冲和普通绘图的区别了
工程源代码及exe下载地址:http://download.csdn.net/detail/i_likechard/9676667
程序运行结果:重点是点击普通绘图与双缓存绘图时能明显感觉到绘制速度的快慢。
相关文章推荐
- MFC绘图不闪烁——双缓冲技术[转]
- MFC 双缓冲 绘图时屏幕闪烁问题
- MFC绘图不闪烁——双缓冲技术
- MFC绘图,双缓冲
- MFC绘图不闪烁——双缓冲技术[转]
- MFC中的双缓冲技术(解决绘图闪烁问题)
- MFC绘图不闪烁——双缓冲技术 [转]
- MFC:只允许产生一个应用程序实例的具体实现
- 50个最精彩的 Photoshop 实例教程【绘图篇】
- 解决MFC屏幕闪动问题:双缓冲的实现
- MFC中绘图函数总结(summary of common painting functions in MFC)
- MFC双缓冲解决闪烁问题
- 基于MFC的OpenGL绘图
- MFC的对话框中使用OpenGL绘图
- MFC VC 双缓冲绘图基本原理与实现,详细解释
- MFC如何高效地绘图
- MFC绘图知识
- 用MFC “菜单响应事件” 实现绘图
- 【旧资料整理】MFC--滚动视图窗口(CScrollView)使用双缓冲问题
- DAO在MFC中的应用实例 .