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
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
-
-
-
- hMemDC = CreateCompatibleDC(hdc);
- hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);
- m_pCxImage->Draw(hMemDC, 0, 0);
- BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);
-
- ReleaseDC(NULL,hdc);
- EndPaint(hWnd, &ps);
- break;

4、其實去除背後的黑色區域很簡單內存
能夠先把沒繪製時候的空白,先拷貝一份在兼容DC(hdcBk)中,在繪製png的時候,先在內存DC(hMemDC)中繪製hdcBk,在用cximage繪製png到hMemDC中,那麼背後就是白色的了,就這麼簡單get
主要代碼:it
- void GetBackImage(HWND hWnd, HDC &hdcBk, int iWidth, int iHeight)
- {
- HDC hdcParent;
- HBITMAP hbitmap;
- hdcParent = GetDC(hWnd);
- hdcBk = CreateCompatibleDC(hdcParent);
- hbitmap = CreateCompatibleBitmap(hdcParent, iWidth, iHeight);
- SelectObject(hdcBk, hbitmap);
- BitBlt(hdcBk, 0, 0, iWidth, iHeight, hdcParent, 0, 0, SRCCOPY);
-
- ReleaseDC(hWnd, hdcParent);
- }
在消息處理的時候:class
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
-
-
-
-
- hMemDC = CreateCompatibleDC(hdc);
- hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);
-
- if (hdcBk == 0)
- {
- GetBackImage(hWnd, hdcBk, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- }
-
- BitBlt(hMemDC, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hdcBk, 0, 0, SRCCOPY);
- m_pCxImage->Draw(hMemDC, 0, 0);
- BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);
-
- DeleteObject(SelectObject(hMemDC, oldBmp));
- DeleteDC(hMemDC);
-
- ReleaseDC(NULL,hdc);
- EndPaint(hWnd, &ps);
- break;
獲得的效果:map
