[轉]cximage雙緩衝繪圖 .

1、原由spa

原本是想用gdi繪圖的,可是一想到用gdi+libpng,還要本身處理一些好比alpha的效果之類的巨麻煩(並且涉及處處理每個像素點的計算,通常都很耗時),我對本身處理像素點的能力一直持有懷疑態度。。so,先用cximage將就着,不知道是否能夠跨平臺。。.net

 

2、用cximage繪製png到屏幕上面確實很容易,簡單的就幾行代碼code

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

 

3、可是簡單的在WM_PAINT消息進行重繪的時候,加入緩衝繪圖,會發現背後出現黑色的區域-------------由於是在內存中使用了HBITMAP形成的,實例代碼:ip

  1.   
 
  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中,那麼背後就是白色的了,就這麼簡單get

 

主要代碼:it

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

在消息處理的時候:class

  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;  
	 

獲得的效果:map

相關文章
相關標籤/搜索