很簡單,利用CPaintManagerUI的方法即可。
const TImageInfo* AddImage(LPCTSTR bitmap, HBITMAP hBitmap, int iWidth, int iHeight, bool bAlpha, bool bShared = false);
該函數作用是添加位圖到自己的資源裏面
參數說明:
bitmap:圖片名,類似於xxx.png等,後綴無所謂,不要重複。
hBitmap:位圖句柄。這個位圖句柄不能被選入到其他的dc裏面。原因見:AlphaBlend失敗,錯誤碼87。
iWidth:位圖的寬度。
iHeight:位圖的高度。
bAlpha:位圖是否有alpha通道。
bShared:是否共享給其他CPaintManagerUI對象(是否是全局共享資源)。
add完畢後,其他控件直接setbkimage正常使用即可,setbkimage傳參是圖片名,就是addimage的第一個參數。
示例:
HDC hDc = GetDC(NULL);
HDC memDC = ::CreateCompatibleDC(hDc);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hDc,200,200);
HGDIOBJ hOld = ::SelectObject(memDC,hBitmap);
RECT rcBMP = {0,0,200,200};
CRenderEngine::DrawColor(memDC,rcBMP,0x80FFFFFF);
SelectObject(memDC,hOld);
DeleteDC(memDC);
ReleaseDC(hDc);
m_PM.AddImage(L"testbmp",hBitmap,200,200,true,true);
pControl->SetBkImage(L"testbmp");
正常add並且set之後,仍然不顯示,那麼可能:
1.你的窗口渲染使用的是AlphaBlend函數,這個函數在渲染這個位圖時失敗了,可以看下錯誤碼。錯誤原因請看我另外一篇文章。
2.位圖繪製的有問題,可能是全透明瞭。gdi的畫圖函數是不支持alpha通道的。
3.位圖句柄失效了,可能是被你誤刪除(DeleteObject)了。
4.圖片名重複,此時你需要先調用CPaintManagerUI::RemoveImage(LPCTSTR bitmap, bool bShared = false);來從CPaintManagerUI中刪除原先的同名圖片,然後SetBkImage時要先pControl->SetBkImage(L"")再pControl->SetBkImage(L"你的圖片名")。