/***************************************************
双缓冲原理简介:
虽然代码有点“繁琐”,但记得我们关心的主要是下面
代码中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
双缓冲绘图——二
最新推荐文章于 2019-05-11 11:11:40 发布