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"你的图片名")。

猜你喜欢

转载自blog.csdn.net/u012081284/article/details/104658524