社区
界面
帖子详情
MFC加载PNG图片问题
zengdezhi
2009-12-31 04:18:25
我用了如下方式加载PNG
CImage image;
CBitmap bitmap;
image.Load(_T("res/static_splitter.png"));
HBITMAP hbmp = image.Detach();
bitmap.Attach(hbmp);
但这种方式用的是相对路径,我把exe文件Copy到另一个目录下再运行就会因为找不到目标图片而出错,有没有其他方法可以不用涉及路径的方法去加载png图片。
...全文
2834
13
打赏
收藏
MFC加载PNG图片问题
我用了如下方式加载PNG CImage image; CBitmap bitmap; image.Load(_T("res/static_splitter.png")); HBITMAP hbmp = image.Detach(); bitmap.Attach(hbmp); 但这种方式用的是相对路径,我把exe文件Copy到另一个目录下再运行就会因为找不到目标图片而出错,有没有其他方法可以不用涉及路径的方法去加载png图片。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
磊000000
2012-02-15
打赏
举报
回复
对于路径问题,如果不改变,一般情况下首先选择作为资源加入工程中。
如果是经常改变的,例如头像等,那肯定不能写死,就采用相对路径,在debug文件夹下面新建一个bmp文件夹,里面放置文件。同理在realse下面建立文件夹。路径可以采取使用系统目录加相对路径的模式。获取运行目录还是可以做到的。
都先生
2012-01-06
打赏
举报
回复
相对路径是没有绝对路径保险的
写不动代码的人
2009-12-31
打赏
举报
回复
路径不对 用绝对路径
vclongking
2009-12-31
打赏
举报
回复
你加载资源的时候最好用绝对路径 否则要重新把资源复制到一定路径下才行
danxuezx
2009-12-31
打赏
举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
程序要使用外部文件,就要事先把所需的文件放在指定的位置,换种说法叫做“安装”。如果把一个安装好的软件中的某个exe文件复制到没有安装的环境下去使用,多数是无法正常运行的。如果想让程序不需安装就可以正常运行,程序就不要依赖外部文件。
[/Quote]
up
caocheng8230
2009-12-31
打赏
举报
回复
将你的EXE拷贝到你的工程文件所在的目录下应该就没有问题了
cnzdgs
2009-12-31
打赏
举报
回复
程序要使用外部文件,就要事先把所需的文件放在指定的位置,换种说法叫做“安装”。如果把一个安装好的软件中的某个exe文件复制到没有安装的环境下去使用,多数是无法正常运行的。如果想让程序不需安装就可以正常运行,程序就不要依赖外部文件。
hunterljm
2009-12-31
打赏
举报
回复
[Quote=引用 5 楼 danxuezx 的回复:]
引用 3 楼 zengdezhi 的回复:
不好意思我程序的BUG终于定位到了,不是PNG的加载问题是ico图片的加载问题,具体定位到的出错的地方代码如下请各位帮忙看看。
CImage image;
HBITMAP hbmp;
CBitmap bitmap;
image.Load(_T("res/audio.ico"));
AfxMessageBox(_T("image.Detach前"));
hbmp = image.Detach();
AfxMessageBox(_T("image.Detach后"));
bitmap.Attach(hbmp);
出错的函数为image.Detach这个函数调用内的一个断言ATLASSUME( m_hBitmap != NULL );的错误,也就是m_hBitmap等于NULL,但是我用VS2008工程运行的时候没有错误,但直接运行生成的exe文件就会出现这个错误。
在AfxMessageBox(_T("image.Detach前"));前面加上下面一句:
if(image.IsNull())
{
MessageBox(_T("Load Error"));
}
看看是否load成功。
[/Quote]
有道理~
danxuezx
2009-12-31
打赏
举报
回复
[Quote=引用 3 楼 zengdezhi 的回复:]
不好意思我程序的BUG终于定位到了,不是PNG的加载问题是ico图片的加载问题,具体定位到的出错的地方代码如下请各位帮忙看看。
CImage image;
HBITMAP hbmp;
CBitmap bitmap;
image.Load(_T("res/audio.ico"));
AfxMessageBox(_T("image.Detach前"));
hbmp = image.Detach();
AfxMessageBox(_T("image.Detach后"));
bitmap.Attach(hbmp);
出错的函数为image.Detach这个函数调用内的一个断言ATLASSUME( m_hBitmap != NULL );的错误,也就是m_hBitmap等于NULL,但是我用VS2008工程运行的时候没有错误,但直接运行生成的exe文件就会出现这个错误。
[/Quote]
在AfxMessageBox(_T("image.Detach前"));前面加上下面一句:
if(image.IsNull())
{
MessageBox(_T("Load Error"));
}
看看是否load成功。
ArcRain
2009-12-31
打赏
举报
回复
应该是资源文件的相对路径不对,导致图片载入失败导致.
res/audio.ico调试时是相对工程路径的.
你如果在DEBUG目录里直接运行EXE,根据这个路径去找ICO文件肯定找不到的.
在EXE所在的目录下,确认该res/audio.ico路径有效
zengdezhi
2009-12-31
打赏
举报
回复
不好意思我程序的BUG终于定位到了,不是PNG的加载问题是ico图片的加载问题,具体定位到的出错的地方代码如下请各位帮忙看看。
CImage image;
HBITMAP hbmp;
CBitmap bitmap;
image.Load(_T("res/audio.ico"));
AfxMessageBox(_T("image.Detach前"));
hbmp = image.Detach();
AfxMessageBox(_T("image.Detach后"));
bitmap.Attach(hbmp);
出错的函数为image.Detach这个函数调用内的一个断言ATLASSUME( m_hBitmap != NULL );的错误,也就是m_hBitmap等于NULL,但是我用VS2008工程运行的时候没有错误,但直接运行生成的exe文件就会出现这个错误。
caocheng8230
2009-12-31
打赏
举报
回复
用CxImage控件吧
CxImage image;
image.load("./res/*.png");
image.draw();
就可以了,我用了CxImage,不错
hunterljm
2009-12-31
打赏
举报
回复
你用CImage::Load()本来就是动态加载图片啊~你可以拷贝exe文件的时候,也同时把资源文件拷贝了~
MFC
加载
png
图片
的类
MFC
通过
图片
控件
加载
png
图片
的类,可以指定宽度高度,可以自适应
图片
大小
mfc
加载
png
格式的
图片
.rar
利用
mfc
的CImage
加载
png
图片
,暂时只能
加载
png
格式的
图片
,其他格式的
加载
,会失真
VC/
MFC
基于对话框 按钮
加载
PNG
图片
VC/
MFC
对话框 按钮
加载
PNG
图片
透明
MFC
png
图片
加载
MFC
png
图片
加载
mfc
PNG
按钮
用Gdiplus实现的
png
按钮, 一个完整的实现工程。
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章