双缓冲绘图——二


/***************************************************
双缓冲原理简介:
虽然代码有点“繁琐”,但记得我们关心的主要是下面
代码中hMemDC。所有绘图代码都在这里进行。

你经常不是这样调用的吗:
	//屏幕上打印字体,画矩形
	HDC hdc=::GetDC(m_hWnd);
	::TextOut(hdc.......);
	::RectangleRect(hdc......);
	::ReleaseDC(m_hWnd,hdc) ;

而在双缓冲里,只需把所有需要用到屏幕hdc的函数中的hdc替换成hMemDC,如:
	//内存dc上打印字体,画矩形
	::TextOut(hMemDC.......);
	::RectangleRect(hMemDC......);

画好后再调用BitBlt把内存hMemDC所有画好的东西拷贝到屏幕hScrDC
	BitBlt(hScrDC,0,60,1000,1000,hMemDC,0,0,SRCCOPY);

步骤一:创建。
1.主要关心的是CreateCompatibleBitmap的后两个参数,
你往内存hMemDC里画的东东就在这个这个范围内
2.如果你已经有一个屏幕dc了,就去掉
HDC hScrDC=::GetDC(m_hWnd)和::ReleaseDC(m_hWnd,hScrDC) 这两行代码,
直接使用已有的屏幕dc代替下面代码中的所有hScrDC
**************************************************/
	HDC hScrDC=::GetDC(m_hWnd);							//创建屏幕DC
	HDC hMemDC=CreateCompatibleDC(hScrDC);				//创建内存DC
	HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,1000,1000); //创建兼容位图
	HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap);	//把位图选进内存DC


/***************************************************
步骤二:绘图。
使用hMemDC绘图,就像你平时绘图一样操作
绘图代码主要在这里完成
**************************************************/
	//填充颜色矩形
	HBRUSH brush=::CreateSolidBrush(RGB(255,216,156));
	RECT rect={0,0,100,100};
	::FillRect(hMemDC,&rect,brush);
	::DeleteObject(brush);

	//画空矩形2
	::SelectObject(hMemDC,(HBRUSH)GetStockObject(NULL_BRUSH));
	::Rectangle(hMemDC,10,10,60,60);

/***************************************************
步骤三:将内存DC图拷贝到屏幕DC上进行显示。
1.BitBlt前4个参数nXDest,nYDest,nWidth,nHeight.确定屏幕DC上的一个矩形区域。
将来要显示在屏幕上的图形范围就在这4个参数所决定的矩形区域内。
2.BitBlt后面2个坐标参数x,y指定从内存hMemDC的哪个位置开始拷贝到屏幕DC上
**************************************************/
	BitBlt(hScrDC,20,20,100,100,hMemDC,0,0,SRCCOPY);	


/***************************************************
步骤四:最后的收尾工作(删除或释放资源)
**************************************************/
	::SelectObject(hMemDC,OldBitmap); 
	::DeleteObject(bitmap);	//释放位图所占Memory,不释放也可以(The system automatically deletes these resources when the process that created them terminates)	
	::DeleteDC(hMemDC) ;			//删除内存DC
	::ReleaseDC(m_hWnd,hScrDC) ;	//释放屏幕DC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值