mfc加载透明图片

  1. 添加一个加载透明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;
}
  1. 在对话框类中添加加载图像到指定窗口的函数
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);
    }

原图为:
这里写图片描述

加载后如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值