duilib直接加載HBITMAP作爲背景圖

很簡單,利用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"你的圖片名")。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章