class CImageEx : public CImage
{
public:
CImageEx(){}
~CImageEx(){}
//加载图片
bool LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType=TEXT("PNG"));
bool SetAlphaBit();
};
bool CImageEx::LoadImage( HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType/*=TEXT("PNG")*/ )
{
//查找资源
HRSRC hResource=FindResource(hInstance,pszResourceName,pszResourceType);
if (hResource==NULL) return false;
//读取资源
DWORD dwImageSize=SizeofResource(hInstance,hResource);
LPVOID pImageBuffer=LoadResource(hInstance,hResource);
//创建数据
IStream * pIStream=NULL;
if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
{
return false;
}
//写入数据
pIStream->Write(pImageBuffer,dwImageSize,NULL);
HRESULT hr = CImage::Load(pIStream);
//释放资源
pIStream->Release();
pIStream = NULL;
if (hr == S_OK)
{
return SetAlphaBit(); //使PNG图片能透明显示
}
else
{
return false;
}
}
bool CImageEx::SetAlphaBit() //CImage类是不能画PNG的,透明部分化成白色了,需要用该函数处理
{
if(IsNull())return false; //判断是否加载了bitmap
//函数 GetBPP() 返回每个像素的 bits 个数 位图深度
if ( GetBPP() == 32 ) //png图像 多了一个透明通道 确认该图像包含Alpha通道
{
LPVOID pBitsSrc = NULL;
BYTE * psrc = NULL;
BITMAP stBmpInfo; //存储bitmap信息
HBITMAP hBmp = (HBITMAP)*this; //将 CImage对象 转化为 HBITMAP句柄
::GetObject(hBmp, sizeof(BITMAP), &stBmpInfo); //根据句柄获取 位图信息存储到stBmpInfo中
if (32 != stBmpInfo.bmBitsPixel || NULL == stBmpInfo.bmBits) //如果位图 一个像素的位数不是32或者没有数据,则返回false
return false;
psrc = (BYTE *) stBmpInfo.bmBits; //位图数据指针赋值给 psrc
for (int nPosY = 0; nPosY < abs(stBmpInfo.bmHeight); nPosY++)
{
for (int nPosX = stBmpInfo.bmWidth; nPosX > 0; nPosX--)
{
BYTE alpha = psrc[3];
psrc[0] = (BYTE)((psrc[0] * alpha) / 255);
psrc[1] = (BYTE)((psrc[1] * alpha) / 255);
psrc[2] = (BYTE)((psrc[2] * alpha) / 255);
psrc += 4;
}
}
}
return true;
}
//调用方法
CImageEx m_ImageBack; //图片
HINSTANCE hInstance = AfxGetInstanceHandle();
m_ImageBack.LoadImage(hInstance,TEXT("CELL_BACK"));