CListCtrl显示透明PNG图片的问题

tangxueyang 2013-12-18 11:06:48


上边的图是我做出来的效果,用的是ListCtrl控件,但是里边的PNG不是透明的。下边是实现的部分代码


Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth, sourceHeight, NULL, NULL); //设定缩略图的大小
HBITMAP hBmp;
pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);
CBitmap *pImage = CBitmap::FromHandle(hBmp); //转换成CBitmap格式位图

TCHAR drive[MAX_PATH] = _T("");
TCHAR dir[MAX_PATH] = _T("");
TCHAR fname[MAX_PATH] = _T("");
TCHAR ext[MAX_PATH] = _T("");

_wsplitpath(path ,drive, dir,fname, ext);
CString itemName(fname);
itemName.Append(ext);

int index = m_imageList.Add(pImage,RGB(255,255, 255));
m_listCtrl.InsertItem(index, itemName, index);


http://bbs.csdn.net/topics/390670670我是要实现这样的效果。
求大神帮解决,在线等回答
...全文
376 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-12-31
  • 打赏
  • 举报
回复
引用 11 楼 chyun7290 的回复:
[quote=引用 楼主 tangxueyang 的回复:] 上边的图是我做出来的效果,用的是ListCtrl控件,但是里边的PNG不是透明的。下边是实现的部分代码

    Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth, sourceHeight, NULL, NULL); //设定缩略图的大小
    HBITMAP hBmp;
    pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);
    CBitmap *pImage = CBitmap::FromHandle(hBmp);         //转换成CBitmap格式位图

    TCHAR drive[MAX_PATH] = _T("");
    TCHAR dir[MAX_PATH] = _T("");
    TCHAR fname[MAX_PATH] = _T("");
    TCHAR ext[MAX_PATH] = _T("");

    _wsplitpath(path ,drive, dir,fname, ext);
    CString itemName(fname);
    itemName.Append(ext);

    int index = m_imageList.Add(pImage,RGB(255,255, 255));
    m_listCtrl.InsertItem(index, itemName, index); 
http://bbs.csdn.net/topics/390670670我是要实现这样的效果。 求大神帮解决,在线等回答
VC加载 png 没有透明功能,要想使加载到程序中的png图像有透明工能,请在加载图片后,加入以下代码:

Cimage mimage;
 HRESULT hr =   mimage.Load(szImageName);
    for(int i = 0; i < mimage.GetWidth(); i++)  
    {  
        for(int j = 0; j < mimage.GetHeight(); j++)  
        {  
            unsigned char* pucColor = reinterpret_cast<unsigned char *>(mimage.GetPixelAddress(i , j));  
            pucColor[0] = pucColor[0] * pucColor[3] / 255;  
            pucColor[1] = pucColor[1] * pucColor[3] / 255;  
            pucColor[2] = pucColor[2] * pucColor[3] / 255;  
        }  
    }  
[/quote] 搞清楚好吧,CImage 是没有,但 GDI+ 本来就支持透明的。
Cherishe7 2013-12-19
  • 打赏
  • 举报
回复
Cherishe7 2013-12-19
  • 打赏
  • 举报
回复
引用 楼主 tangxueyang 的回复:
上边的图是我做出来的效果,用的是ListCtrl控件,但是里边的PNG不是透明的。下边是实现的部分代码

    Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth, sourceHeight, NULL, NULL); //设定缩略图的大小
    HBITMAP hBmp;
    pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);
    CBitmap *pImage = CBitmap::FromHandle(hBmp);         //转换成CBitmap格式位图

    TCHAR drive[MAX_PATH] = _T("");
    TCHAR dir[MAX_PATH] = _T("");
    TCHAR fname[MAX_PATH] = _T("");
    TCHAR ext[MAX_PATH] = _T("");

    _wsplitpath(path ,drive, dir,fname, ext);
    CString itemName(fname);
    itemName.Append(ext);

    int index = m_imageList.Add(pImage,RGB(255,255, 255));
    m_listCtrl.InsertItem(index, itemName, index); 
http://bbs.csdn.net/topics/390670670我是要实现这样的效果。 求大神帮解决,在线等回答
VC加载 png 没有透明功能,要想使加载到程序中的png图像有透明工能,请在加载图片后,加入以下代码:

Cimage mimage;
 HRESULT hr =   mimage.Load(szImageName);
    for(int i = 0; i < mimage.GetWidth(); i++)  
    {  
        for(int j = 0; j < mimage.GetHeight(); j++)  
        {  
            unsigned char* pucColor = reinterpret_cast<unsigned char *>(mimage.GetPixelAddress(i , j));  
            pucColor[0] = pucColor[0] * pucColor[3] / 255;  
            pucColor[1] = pucColor[1] * pucColor[3] / 255;  
            pucColor[2] = pucColor[2] * pucColor[3] / 255;  
        }  
    }  
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
还有一个问题就是鼠标,移动末一项图标时高亮显示,大家看到过类似的例子麻烦告诉下,谢谢了。
「已注销」 2013-12-18
  • 打赏
  • 举报
回复
1. 创建 ImageList 类型为图标(MFC:CImageList) 2. 将 ImageList 与 ListView 关联(CListCtrl::SetImageList) 3. 使用 GDI+ 加载 png(Bitmap::FromFile),并可以得到 HICON(Bitmap::GetHICON)。如能将其缩放为适合的图标大小则更好。将其添加到 ImageList(ImageList::Add),返回一个图标在 ImageList 重的索引。 4. CListCtrl::InsertItem(0, _T("QQ"), 图标索引);
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
引用 8 楼 SXJIAKE 的回复:
把这个 png 转换为 HBITMAP 再转换为 HICON,作为图标加载进去估计可以。
好的我试一下看看,谢谢啦。
「已注销」 2013-12-18
  • 打赏
  • 举报
回复
把这个 png 转换为 HBITMAP 再转换为 HICON,作为图标加载进去估计可以。
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
晕没人帮忙解决吗,版主出来帮忙解决下吧,我是写C#的实在不懂MFC啊
MJ_dangerous 2013-12-18
  • 打赏
  • 举报
回复
如果你是在解决不了这个问题,我推荐你使用一些开源的皮肤库,我目前使用的SKinSE可以很好的解决这个问题,不过内部实现也是GDI+,但是没有源码。
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
没人帮忙解决吗...
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
引用 2 楼 ftd2013 的回复:
如果你的PNG图片背景不透明,显示也不透明呀。
可是,我这个确实是透明的PNG啊,而且listCtrl也是透明的啊。
tangxueyang 2013-12-18
  • 打赏
  • 举报
回复
引用 1 楼 tangxueyang 的回复:
还有一个问题就是鼠标,移动末一项图标时高亮显示,大家看到过类似的例子麻烦告诉下,谢谢了。
可是,我这个确实是透明的PNG啊,而且listCtrl也是透明的啊。
打你屁屁 2013-12-18
  • 打赏
  • 举报
回复
如果你的PNG图片背景不透明,显示也不透明呀。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧