- 添加一个加载透明png图像文件的函数
BOOL LoadImageFromResource(CImage *pImage, UINT nResID, LPCTSTR lpTyp)
{
if (pImage == NULL)
return false;
pImage->Destroy();
// 查找资源
HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
if (hRsrc == NULL)
return false;
// 加载资源
HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
if (hImgData == NULL)
{
::FreeResource(hImgData);
return false;
}
// 锁定内存中的指定资源
LPVOID lpVoid = ::LockResource(hImgData);
LPSTREAM pStream = NULL;
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
// 解除内存中的指定资源
::GlobalUnlock(hNew);
// 从指定内存创建流对象
HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
if (ht != S_OK)
{
GlobalFree(hNew);
}
else
{
// 加载图片
pImage->Load(pStream);
GlobalFree(hNew);
}
// 释放资源
::FreeResource(hImgData);
return true;
}
- 在对话框类中添加加载图像到指定窗口的函数
void CXXXDlg::loadLogo(int nID)
{
HWND hwnd = GetDlgItem(nID)->m_hWnd; //获取窗口的HWND
::InvalidateRect(hwnd, NULL, true); //或者 ::InvalidateRect( hwnd, NULL, false );
::UpdateWindow(hwnd);
CDC *pDC = GetDlgItem(nID)->GetDC();
CImage Image;
LoadImageFromResource(&Image, IDB_NEWLOGO, _T("PNG"));
if (Image.IsNull())
{
MessageBox(_T("没加载成功"));
return;
}
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i = 0; i < Image.GetWidth(); i++)
{
for (j = 0; j < Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
CRect rect;
GetDlgItem(nID)->GetClientRect(&rect);
Image.Draw(pDC->m_hDC, rect);
Image.Destroy();
ReleaseDC(pDC);
}
3.在对话框的界面中添加一个静态文本框控件(IDC_STATIC),并在OnCtlColor函数中设置该静态文本框的背景色为透明,修改该静态文本框的ID号(如IDC_PIC_LOGO)
// 设置静态文本颜色
if (nCtlColor == CTLCOLOR_STATIC)
{
// 设置静态控件的背景颜色和文本颜色
pDC->SetTextColor(m_TextColor);
//pDC->SetBkColor(RGB(191, 219, 255));
pDC->SetBkMode(TRANSPARENT);// 模式设置为透明,则忽略控件的背景颜色与对话框一致
return m_brush;
}
4.在OnPaint函数中的else函数中添加loadLogo函数,显示图片
void CLaserCLHDlg::OnPaint()
{
if (IsIconic())
{
...省略
}
else
{
CDialogEx::OnPaint();
loadLogo(IDC_PIC_LOGO);
}
原图为:
加载后如下: