很简单,利用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"你的图片名")。