双缓冲和非双缓冲的区别比较(gdi,gdiplus)

        作者在最近的工作当中,为了使图像能更好的刷新不闪动,要用到双缓冲技术。

        关于双缓冲技术以前也曾经用到过,最近恰好整理了一下,写了一个小程序。里面包含了采用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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值