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 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
磊000000 2012-02-15
  • 打赏
  • 举报
回复
对于路径问题,如果不改变,一般情况下首先选择作为资源加入工程中。
如果是经常改变的,例如头像等,那肯定不能写死,就采用相对路径,在debug文件夹下面新建一个bmp文件夹,里面放置文件。同理在realse下面建立文件夹。路径可以采取使用系统目录加相对路径的模式。获取运行目录还是可以做到的。
都先生 2012-01-06
  • 打赏
  • 举报
回复
相对路径是没有绝对路径保险的
  • 打赏
  • 举报
回复
路径不对 用绝对路径
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文件的时候,也同时把资源文件拷贝了~

15,979

社区成员

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

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