码迷,mamicode.com
首页 > 其他好文 > 详细

双缓冲显示位图

时间:2015-03-10 12:17:53      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

原理:

创建内存位图对象;

创建内存DC;

将位图对象选入到内存DC,便可以在内存DC中画图;

最后将内存DC中的图拷贝到窗口DC


在BOOL C***Dlg::OnEraseBkgnd(CDC* pDC) 中实现:

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));    
   
//绘图(如果是现成的位图,只要LoadBitmap一下资源就可以直接贴图了)  
MemDC.MoveTo(……);    
MemDC.LineTo(……);    
   
//将内存中的图拷贝到屏幕上进行显示    
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);  
//还原内存DC原来位图(通常省略)
memDC.SelectObject(pOldBmp);  
   
//绘图完成后的清理    
MemBitmap.DeleteObject();    
MemDC.DeleteDC();  



例如:

//加载图片
CBitmap m_BkGndBmp;
m_BkGndBmp.LoadBitmap(IDB_BITMAP3);

//获取窗口大小
CRect rcClient;
GetClientRect(&rcClient);

//获取图片大小
BITMAP bm;
m_BkGndBmp.GetBitmap(&bm);

//创建内存DC
CDC memDC;
memDC.CreateCompatibleDC(pDC);

//将为图选入DC
CBitmap *pOldBmp = memDC.SelectObject(&m_BkGndBmp);

//拷贝DC到窗口
pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

//清理内存
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();



位图拷贝函数说明(区别在于StretchBlt()可进行图片拉伸或压缩):

该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC,	int xSrc, int ySrc, DWORD dwRop);

函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
BOOL StretchBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);




双缓冲显示位图

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/44171359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!