作者在最近的工作当中,为了使图像能更好的刷新不闪动,要用到双缓冲技术。
关于双缓冲技术以前也曾经用到过,最近恰好整理了一下,写了一个小程序。里面包含了采用gdi绘图,
采用gdi双缓冲绘图,以及gdi+绘图,采用gdi+双缓冲绘图等内容。并且把双缓冲和非双缓冲的效果,两两做了
比较。
程序界面如下图:
将一部分代码贴上,供大家参考(以下部分是采用gdi绘图的比较)。
//直接用GDI绘图(绘制填充矩形)
void CDoubleCushion_TestDlg::OnBnClickedButton1()
{
CDC *pDC = GetDC();
pDC->SelectStockObject(BLACK_PEN);
pDC->SelectStockObject(WHITE_BRUSH);
pDC->Rectangle(10, 10, 150, 200);
ReleaseDC(pDC);
}
//用GDI双缓冲绘图(绘制填充矩形)
void CDoubleCushion_TestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC = GetDC();
HDC hdc = pDC->m_hDC;
RECT rc;
GetClientRect(&rc);
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc, hBmp);
//在此使用hMemDc进行 GDI 绘制
SelectObject(hMemDc, GetStockObject(BLACK_PEN));
SelectObject(hMemDc, GetStockObject(WHITE_BRUSH));
Rectangle(hMemDc, 10, 10, 150, 200);
//BitBlt(hdc, 0, 0, rc.right, rc.bottom, hMemDc, 0, 0, SRCCOPY);
BitBlt(hdc, 10, 10, 150-10, 200-10, hMemDc, 10, 10, SRCCOPY);//将hMemDc的图像复制到hdc上
SelectObject(hMemDc, hOldBmp);
DeleteObject(hBmp);
DeleteObject(hMemDc);
ReleaseDC(pDC);
}
//清除,(方法是绘制了一个填充色和边框颜色都和对话框背景色一致的矩形)
void CDoubleCushion_TestDlg::OnBnClickedButton3()
{
CDC *pDC = GetDC();
HDC hdc = pDC->m_hDC;
HPEN pen=CreatePen(PS_SOLID, 1, RGB(0xf0,0xf0,0xf0));
HBRUSH brush = CreateSolidBrush(RGB(0xf0,0xf0,0xf0));
SelectObject(hdc,pen);
SelectObject(hdc,brush);
Rectangle(hdc,0, 0, 200, 200);
ReleaseDC(pDC);
}
有兴趣的朋友,可以直接联系我要整个程序的源码,不过可能会稍稍收取一点费用,邮件:singleeboy@126.com