双缓冲是一种思想,也是一种方法,它可以避免频繁的闪烁问题。如果在画布上直接绘画,由于每次都会重新擦除然后重绘,绘制需要时间,所以肉眼会看到闪烁问题。解决的方法就是在内存中先创建出一个内存dc,然后在内存dc中绘制,绘制结束后,直接“贴”上去就好了。
具体步骤如下:
1、声明
HDC hMemDC;
HBITMAP hBitmap;
2、创建相容的内存DC
hMemDC = CreateCompatibleDC(hdc);
3、创建位图
hBitmap = CreateCompatibleBitmap(hdc, rt.right - rt.left, rt.bottom - rt.top);//rt为RECT变量
4、将位图选入到内存DC中,没有这一步的话,内存DC只能是单色的,置换后才是多彩的
SelectObject(hMemDC, hBitmap);
5、绘制
.....
6、拷贝到原先内存
BitBlt(hdc, 0, 0, rt.right - rt.left, rt.bottom - rt.top, hMemDC, 0, 0, SRCCOPY)
7、释放内存
DeleteDC(hMemDC);
DeleteObject(hBitmap);
EndPaint(hwnd,&ps);
//解释一下DeleteDC与ReleaseDC的区别,如果是create出来的,请用DeleteDC,如果是get出来的,请用ReleaseDC。
总结代码如下:
PAINTSTRUCT ps; RECT rtClient; GetClientRect(hwnd,&rtClient); HDC hdc = BeginPaint(hwnd, &ps); HDC hMemDC = CreateCompatibleDC(hdc); HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rtClient.right - rtClient.left, rtClient.bottom - rtClient.top);//rt为RECT变量; SelectObject(hMemDC, hBitmap); FillRect(hMemDC, &rtClient,WHITE_BRUSH);
BitBlt(hdc, 0, 0,rtClient.right - rtClient.left, rtClient.bottom - rtClient.top, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); DeleteObject(hBitmap); EndPaint(hwnd,&ps);