[转]cximage双缓冲绘图 .

1、起因

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

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

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

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


  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绘制pnghMemDC中,那么背后就是白色的了,就这么简单

主要代码:

  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. }  
     

在消息处理的时候:

  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;  
	 

得到的效果:

原文地址:https://www.cnblogs.com/FCoding/p/3208164.html