如何在MFC里显示png图片或背景透明的bmp图片

woailiyan 2010-11-12 06:34:03
我最近在用MFC做一个Listview界面,里面要求有几组状态灯。开始我就新建一个bmp图片然后画了几个不同颜色的圆,但是感觉很不好看,而且bmp的背景和listview的背景不一样。在网上找了些漂亮的图片都是png格式的,不知道怎么显示,转化为bmp文件背景也不是透明。我是在一个CStatic上面显示位图的,是不是CStatic不能显示png图片啊。
这两天在网上看了几个方法,有说用掩码与或之类把bmp位图变透明的,但是没看太明白。。还有说VS08里有一个Cpng。。类了,可以直接用,但是试了下都没成功,可能没理解太透吧。哪位能较详细说明下或者给个别的方法满足这个要求,万分感谢~
下面是我工程里涉及到图片显示部分的代码:
HBITMAP m_bmp;
m_bmp = (HBITMAP)LoadImage(AfxGetInstanceHandl(),"data\\green.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_LOADMAP3DCOLORS);//加载bmp
CStatic *m_pic;//这是显示图片的CStatic
CImageList m_imlNull;//这个还不太清楚,我在初始化listview的时候是象下面这么写的
m_imlNull.Create(22, 22, ILC_COLORDDB|ILC_MASK, 2, 30);
theCtrl.SetImageList(&m_imlNull, LVSIL_SMALL);
然后就是给静态文本框设置图片以及放到正确的行列上:
m_pic[no].SetBitmap(m_bmp);
m_pic[no].MoveWindow(rcCtrl);
m_pic[no].ShowWindow(SW_SHOW);
研究好久都没结果,怎么使得列表项的图片背景透明或者直接显示png图片啊。。。哪位能帮助一下,谢谢~
...全文
3765 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
woailiyan 2010-11-19
  • 打赏
  • 举报
回复
基本上画出来了,重写了CStatic类,同时用掩码的方式来使位图透明,不过边缘有一些白色的锯齿。。现在发现用GDI+能直接显示png,正在实验呢。谢谢楼上的各位
woailiyan 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 skydoom 的回复:]

是和360一样的Listview吗
[/Quote]
360?就是自己写了一个类,继承自CListView,显示一个列表视图,然后在列表的指定行列显示一个图片,让它背景透明以便和LISTVIEW背景色一致。这个怎么实现呢?
woailiyan 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]

引用 2 楼 woailiyan 的回复:
引用 1 楼 xianglitian 的回复:

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。
CStatic里不能直接用PNG或镂空的bmp
无论如……
[/Quote]
那VS08里有什么控件是可以放置用PNG或镂空的bmp的吗?可以不用CStatic的,我只是想在列表的指定行列显示一个图片,让它背景透明以便和LISTVIEW背景色一致
skydoom 2010-11-14
  • 打赏
  • 举报
回复
是和360一样的Listview吗
muzizongheng 2010-11-13
  • 打赏
  • 举报
回复
vs2008 sp1里有CMFCToolBarImages新类, 支持32位的图片, 也就是带阿尔法通道的png格式。

hgbsam 2010-11-13
  • 打赏
  • 举报
回复
BITMAP bm;
CDC ImageDC;
ImageDC.CreateCompatibleDC(&dc);
CBitmap ForeBMP;
ForeBMP.LoadBitmap(IDB_TITLE);
ForeBMP.GetBitmap(&bm);
CBitmap *pOldImageBMP=ImageDC.SelectObject(&ForeBMP);
TransparentBlt(dc.GetSafeHdc(),100,0,750,50,
ImageDC.GetSafeHdc(),0,0,bm.bmWidth,bm.bmHeight,RGB(0xff,0xff,0xff));
ImageDC.SelectObject(pOldImageBMP);
向立天 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 woailiyan 的回复:]
引用 1 楼 xianglitian 的回复:

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。
[/Quote]CStatic里不能直接用PNG或镂空的bmp
无论如何都要改一下
hurryboylqs 2010-11-12
  • 打赏
  • 举报
回复
用CImage这个类
#include <atlbase.h>
#include<atlimg.h>
zgklem 2010-11-12
  • 打赏
  • 举报
回复
看看这两个!不懂可发消息给我!
http://blog.csdn.net/xuweiqun/archive/2006/11/11/1378714.aspx
http://express.ruanko.com/ruanko-express_17/webpage/tech3.html
woailiyan 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgklem 的回复:]

引用 2 楼 woailiyan 的回复:
引用 1 楼 xianglitian 的回复:

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。

没有背景透明的bmp图片,你可以试试gif图片!如果……
[/Quote]
能告诉我用掩码的话应该怎么办吗?我之前在网上也看到一些,就是没太明白。效果的话。。不知道怎么发截图。因为我工程里的ListView是用报表风格,设置了隔行换色,所以如果图片背景不透明的话,显示图片的那一列颜色都是一样的,不能做到隔行换色。。能详细些告诉我下用掩码的方法吗?谢谢
zgklem 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 woailiyan 的回复:]
引用 1 楼 xianglitian 的回复:

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。
[/Quote]
没有背景透明的bmp图片,你可以试试gif图片!如果一定要用bmp图片的话,就只能用掩码了!你要什么效果呢?给个截图看看!
逸萌 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 woailiyan 的回复:]
引用 1 楼 xianglitian 的回复:

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。
[/Quote]up
woailiyan 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]

显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/
[/Quote]
有没有在CStatic或者其他控件上显示png位图的方法呢?或者显示背景透明的bmp位图。照那链接里样的话我要改很多地方了。。
向立天 2010-11-12
  • 打赏
  • 举报
回复
显示png图片用GDI+
参考资料
http://kb.cnblogs.com/a/1346704/

15,978

社区成员

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

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