双缓冲绘图
2015-07-10 16:10
260 查看
(1) GDI这样做
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景,你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
/***
使用MemDC画图
****/
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
(2) GDI+这样做
GDI+无闪烁绘图的原理就是不直接在OnDraw函数下绘图,而是先创建个Bitmap对象,然后用刚才的Bitmap对象创建一个Graphics的内存图像,然后所有的绘图操作都在
内存图像中进行,最后用DrawImage方法把内存图像显示到屏幕。
void CDataView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: 在此添加绘制代码
pDC->TextOut(100,100,L"数据视图");
Graphics g(pDC->m_hDC);
CRect rcClient;
GetClientRect(&rcClient);
Bitmap bmp(rcClient.Width(), rcClient.Height());
Graphics * buffergraphics = Graphics::FromImage(&bmp);//关键部分,创建一个内存图像
SolidBrush brush(Color(255, 0,0, 255));
buffergraphics ->FillRectangle(&brush,0, 0, rcClient.Width(),rcClient.Height()); //在内存图像中画图
g.DrawImage(&bmp,0, 0, rcClient.Width(), rcClient.Height());//将内存图像显示到屏幕
delete buffergraphics ;
g.ReleaseHDC(pDC->m_hDC);
}
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景,你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
/***
使用MemDC画图
****/
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
(2) GDI+这样做
GDI+无闪烁绘图的原理就是不直接在OnDraw函数下绘图,而是先创建个Bitmap对象,然后用刚才的Bitmap对象创建一个Graphics的内存图像,然后所有的绘图操作都在
内存图像中进行,最后用DrawImage方法把内存图像显示到屏幕。
void CDataView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: 在此添加绘制代码
pDC->TextOut(100,100,L"数据视图");
Graphics g(pDC->m_hDC);
CRect rcClient;
GetClientRect(&rcClient);
Bitmap bmp(rcClient.Width(), rcClient.Height());
Graphics * buffergraphics = Graphics::FromImage(&bmp);//关键部分,创建一个内存图像
SolidBrush brush(Color(255, 0,0, 255));
buffergraphics ->FillRectangle(&brush,0, 0, rcClient.Width(),rcClient.Height()); //在内存图像中画图
g.DrawImage(&bmp,0, 0, rcClient.Width(), rcClient.Height());//将内存图像显示到屏幕
delete buffergraphics ;
g.ReleaseHDC(pDC->m_hDC);
}
相关文章推荐
- tomcat配置数据源
- Spring3+Mybatis3+Mysql+ivy+liquibase
- Hibernate 持久化对象的状态
- 基于Erlang高并发测试之服务端准备
- opencv源码之一:cvboost.cpp
- Linux下定时任务配置-crontab
- 亚马逊云主机aws linux putty 登录报错 server refused our key解决
- 拥有root权限提权让普通用户具有root权限
- linux下制作u盘启动盘的方法
- 新建和配置Phalcon工程
- centos更改默认语言
- 【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国
- 获取系统键盘上的表情
- Linux之mount命令详解
- 庄家控盘的特征
- TCP及socket通信原理
- java通过post方式发送接收xml信息
- Python自动登录126邮箱的方法
- 华为 3G 移植回忆
- leetcode 日经贴,Cpp code -Palindrome Linked List