• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Fcoding_狂人
自由 编码 Fcoding
博客园    首页    新随笔    联系   管理     

[转]cximage双缓冲绘图 .

1、起因

本来是想用gdi绘图的,但是一想到用gdi+libpng,还要自己处理一些比如alpha的效果之类的巨麻烦(而且涉及到处理每一个像素点的计算,一般都很耗时),我对自己处理像素点的能力一直持有怀疑态度。。so,先用cximage将就着,不知道是否可以跨平台。。

 

2、用cximage绘制png到屏幕上面确实很容易,简单的就几行代码

参考:http://blog.csdn.net/zengraoli/article/details/8635225

 

3、但是简单的在WM_PAINT消息进行重绘的时候,加入缓冲绘图,会发现背后出现黑色的区域-------------因为是在内存中使用了HBITMAP造成的,实例代码:

[cpp] view plaincopyprint?
  1.   

[cpp] view plaincopyprint?
  1. case WM_PAINT:  
  2.     hdc = BeginPaint(hWnd, &ps);  
  3.   
  4.     // TODO: 在此添加任意绘图代码...   
  5.     /*      hdc= GetDC(hWnd);*/  
  6.     hMemDC  = CreateCompatibleDC(hdc);  
  7.     hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
  8.     oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);  
  9.     m_pCxImage->Draw(hMemDC, 0, 0);   
  10.     BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);  
  11.   
  12.     ReleaseDC(NULL,hdc);  
  13.     EndPaint(hWnd, &ps);  
  14.     break;  

4、其实去除背后的黑色区域很简单

可以先把没绘制时候的空白,先拷贝一份在兼容DC(hdcBk)中,在绘制png的时候,先在内存DC(hMemDC)中绘制hdcBk,在用cximage绘制png到hMemDC中,那么背后就是白色的了,就这么简单

 

主要代码:

[cpp] view plaincopyprint?
  1. void GetBackImage(HWND hWnd, HDC &hdcBk, int iWidth, int iHeight)  
  2. {  
  3.     HDC hdcParent/*, hdcBk*/;  
  4.     HBITMAP hbitmap;  
  5.     hdcParent = GetDC(hWnd);  
  6.     hdcBk = CreateCompatibleDC(hdcParent);  
  7.     hbitmap = CreateCompatibleBitmap(hdcParent, iWidth, iHeight);  
  8.     SelectObject(hdcBk, hbitmap);  
  9.     BitBlt(hdcBk, 0, 0, iWidth, iHeight, hdcParent, 0, 0, SRCCOPY);  
  10.   
  11.     ReleaseDC(hWnd, hdcParent);  
  12. }  
     

在消息处理的时候:

[cpp] view plaincopyprint?
  1. case WM_PAINT:  
  2.     hdc = BeginPaint(hWnd, &ps);  
  3.   
  4.     // TODO: 在此添加任意绘图代码...   
  5.     /*      hdc= GetDC(hWnd);*/  
  6.   
  7.     hMemDC  = CreateCompatibleDC(hdc);  
  8.     hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
  9.     oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);  
  10.   
  11.     if (hdcBk == 0)  
  12.     {  
  13.         GetBackImage(hWnd, hdcBk, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());  
  14.     }  
  15.       
  16.     BitBlt(hMemDC, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hdcBk, 0, 0, SRCCOPY);  
  17.     m_pCxImage->Draw(hMemDC, 0, 0);  
  18.     BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);  
  19.   
  20.     DeleteObject(SelectObject(hMemDC, oldBmp));  
  21.     DeleteDC(hMemDC);  
  22.   
  23.     ReleaseDC(NULL,hdc);  
  24.     EndPaint(hWnd, &ps);  
  25.     break;  
	 

得到的效果:

posted @ 2013-07-23 11:31  Fcoding_狂人  阅读(1223)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3