双缓冲绘图
普通绘图
- 普通绘图:每次绘制直接在目标窗口进行绘制
而大量的绘制操作是需要时间的,所以会造成不停的闪。
双缓存绘图
双缓冲绘图:先创建一块内存,直接对内存操作
画完之后在贴到窗口上,只对窗口进行了一次操作,消耗的时间极少,所以更优秀。步骤: 1. 创建一块内存DC
2. 创建一块兼容位图(一块指定大小的内存 == 画布)
3. 内存DC选择兼容位图
4. 设置内存画刷
5. 复制信息到窗口DC
6. 删除内存DC,释放窗口DC
实例代码
//MFC双缓冲绘图
void CCADView::OnDraw(CDC* pDC)
{
CRect rc;
GetClientRect(rc);
//双缓存
//1, 创建一个内存DC
CDC memDC;
memDC.CreateCompatibleDC(pDC);
//2, 创建兼容位图
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
//3,内存DC选择内存画布
memDC.SelectObject(bitmap);
//填充背景颜色
CBrush brush(RGB(255,255,255));
memDC.FillRect(rc, &brush);
//4,设置画刷颜色
memDC.SelectObject(::GetStockObject(BLACK_BRUSH));
//绘图代码
...
//5. 复制信息到DC
pDC->BitBlt(0,0,rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
}
//SDK代码
void OnDraw()
{
RECT rc ;
HDC hdc, memdc;
HBITMAP hBitmap, hOldBitmap;
::GetClientRect(hwnd, &rc);
hdc = GetDC( hwnd );
//1.创建内存DC
memdc = ::CreateCompatibleDC( hdc );
//2.创建兼容位图
hBitmap = ::CreateCompatibleBitmap( hdc, rc.right, rc.right );
//3.内存DC选择内存画布
hOldBitmap = (HBITMAP)::SelectObject( memdc, hBitmap );
//背景刷成白色
::FillRect(hBitmap, &rc, (HBRUSH)::GetStockObject( WHITE_BRUSH ) );
::BitBlt(hdc, //贴到哪个窗口
rc.left, //窗口起始x
rc.top, //窗口起始y
rc.right, //窗口结束x
rc.bottom, //窗口结束y
memdc, //内存DC
0, //内存画布的起始x
0, //内存画布的起始y
SRCCOPY);
//删除内存dc
::DeleteDC( memdc );
//释放窗口DC
::ReleaseDC( hwnd, hdc );
//删除对象
::DeleteObject( hBitmap );
}