FindResource 当资源为 icon时,返回值为 NULL???

ruoge2007 2010-01-21 06:26:31
ImageFromIDResource( IDI_ICON4, "Icon", m_pImageLinkOn);
BOOL CALXImage::ImageFromIDResource(UINT nID, LPCTSTR sTR,Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
return FALSE;

FindResource 失败
...全文
605 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟和雾 2011-06-22
  • 打赏
  • 举报
回复
w_anthony 同志说得对,用他这方法解决了。IDE:VS2010 系统:XP sp3
笨菜鸟一个 2011-06-01
  • 打赏
  • 举报
回复
我也遇到这样的问题,你解决了吗?
ruoge2007 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 w_anthony 的回复:]
引用 13 楼 ruoge2007 的回复:
引用 9 楼 w_anthony 的回复:
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?


不是存储为文件的啊,就是在VC上建一个空白的,::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); 也是为空。 也不是几个不同的尺码的图像。


不是跟你说过了么?你指定的图标ID对应的是在图标组RT_GROUP_ICON的资源ID,不管这图标是空白的还是只包含一个ico,类型也都是RT_GROUP_ICON。
你还是先说你到底想干什么?

[/Quote]

我的目的是把icon载入到gdi+的Image,然后再用gdi+显示出来,这分一定是你的了 :)。帮我大忙了
w_anthony 2010-01-28
  • 打赏
  • 举报
回复
有一点说错了,如果是32位带alpha通道图标,是要GetIconInfo用得到的HBITMAP hColor成员创建一个Bitmap进行LockBits,如果是用HICON创建的做LockBits这时候已经丢了alpha通道。
w_anthony 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ruoge2007 的回复:]
引用 14 楼 w_anthony 的回复:
引用 13 楼 ruoge2007 的回复:
引用 9 楼 w_anthony 的回复:
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?


不是存储为文件的啊,就是在VC上建一个空白的,::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); 也是为空。 也不是几个不同的尺码的图像。


不是跟你说过了么?你指定的图标ID对应的是在图标组RT_GROUP_ICON的资源ID,不管这图标是空白的还是只包含一个ico,类型也都是RT_GROUP_ICON。
你还是先说你到底想干什么?



我的目的是把icon载入到gdi+的Image,然后再用gdi+显示出来,这分一定是你的了 :)。帮我大忙了
[/Quote]
Image或其子类Bitmap没有直接从ico格式数据直接创建的接口。
如果你的ico资源原先只包含一个图标,可以用LoadImage(hInst, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR)得到HICON,用Image的子类Bitmap的构造函数或者FromHICON传入这个HICON来得到你需要的Bitmap。如果这个图标不是32位带alpha通道图标,那么到此为止已经完成任务了;如果是32位带alpha通道图标并且需要alpha通道的数据,那么对于这个Bitmap要进行LockBits参数填PixelFormat32bppRGB,然后自己创建一个PixelFormat32bppARGB格式的,也LockBits但参数填PixelFormat32bppARGB,对两者内存复制一下,删除原先的Bitmap,用自己创建的Bitmap即可(不做这个步骤会丢失alpha通道)。全部结束以后DestroyIcon删除之前创建的HICON。
如果你的ico资源包含多个图标,就需要解析RT_GROUP_ICON里面的数据,其内存内容可以强制转换为GRPICONDIR*,其成员idCount表示下面接着几个GRPICONDIRENTRY,一个GRPICONDIRENTRY对应一个图标,而GRPICONDIRENTRY的成员nID表示这个图标在RT_ICON里面对应的资源ID,这时候可以用CreateIconFromResourceEx对RT_ICON里面LockResouce到的数据创建出HICON,后面就跟第一种情况相同了,涉及的结构体如下:

#pragma pack(1)
typedef struct {
BYTE bWidth; // Width, in pixels, of the image
BYTE bHeight; // Height, in pixels, of the image
BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
BYTE bReserved; // Reserved
WORD wPlanes; // Color Planes
WORD wBitCount; // Bits per pixel
DWORD dwBytesInRes; // how many bytes in this resource?
WORD nID; // the ID
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
typedef struct {
WORD idReserved; // Reserved (must be 0)
WORD idType; // Resource type (1 for icons)
WORD idCount; // How many images?
GRPICONDIRENTRY idEntries[1]; // The entries for each image
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack()


如果有兴趣也可以自己解析RT_ICON里面的数据,这样就不用借助HICON来完成Image的创建,其格式可以到网上搜。

w_anthony 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ruoge2007 的回复:]
引用 9 楼 w_anthony 的回复:
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?



不是存储为文件的啊,就是在VC上建一个空白的,::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); 也是为空。 也不是几个不同的尺码的图像。
[/Quote]

不是跟你说过了么?你指定的图标ID对应的是在图标组RT_GROUP_ICON的资源ID,不管这图标是空白的还是只包含一个ico,类型也都是RT_GROUP_ICON。
你还是先说你到底想干什么?
ruoge2007 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 w_anthony 的回复:]
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?

[/Quote]

不是存储为文件的啊,就是在VC上建一个空白的,::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); 也是为空。 也不是几个不同的尺码的图像。
w_anthony 2010-01-23
  • 打赏
  • 举报
回复
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?
MoXiaoRab 2010-01-23
  • 打赏
  • 举报
回复
那就应该是RT_ICON,而不是"ICON"。
ls2141 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 w_anthony 的回复:]
一般来说是不需要单独把ico分解开取出来的,直接LoadIcon就行了。
但如果你是想把资源里面的ico保存到文件里面,那就比较麻烦了,需要自己解析一下数据头才行了,虽然数据头不复杂,也不是三言两语说得清楚的。
LZ是想做什么?

[/Quote]
同意这么晚还辛苦在线的大牛们!。。。如果知道获取图标只是用来绘制显示什么的,那就简单多了,不用这么复杂的.直接读取保存什么的就行了。确保你的IDI_ICON4资源存在应该就没什么问题吧。
klkvc386 2010-01-23
  • 打赏
  • 举报
回复
Mark
hzy694358 2010-01-22
  • 打赏
  • 举报
回复
mark
w_anthony 2010-01-22
  • 打赏
  • 举报
回复
图标资源有两种,一种是图标组资源RT_GROUP_ICON,另一种是图标资源RT_ICON。
假设一个ico文件包含两个图标,那么你指定的图标ID对应的是在图标组RT_GROUP_ICON的资源ID,这里的数据是ico数据头,不包含图标数据,但可以根据这里的数据得到它包含的两个图标在RT_ICON中的ID。
所以你这个所应该使用的类型应该是RT_GROUP_ICON
MoXiaoRab 2010-01-22
  • 打赏
  • 举报
回复
你的资源窗口截个图我看看就知道代码怎么写了
ruoge2007 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
ImageFromIDResource(IDI_ICON4,RT_ICON, m_pImageLinkOn);

[/Quote]
好似不管用,RT_ICON返回值为空
ruoge2007 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
ImageFromIDResource(IDI_ICON4,RT_ICON, m_pImageLinkOn);

[/Quote]

好似不管用,返回值为空
ruoge2007 2010-01-22
  • 打赏
  • 举报
回复
图片
http://static10.photo.sina.com.cn/orignal/4c733c75t7dbeff4d24d9&690 
http://photo.blog.sina.com.cn/photo/4c733c75t7dbeff4d24d9
这都是截图
ruoge2007 2010-01-22
  • 打赏
  • 举报
回复

这是图片,我用RT_GROUP_ICON返回值不为空,但是还是显示不出来。我用gdi+来显示的,
如 w_anthony 所说,“这里的数据是ico数据头,不包含图标数据”,可能是这个原因吧。
“但可以根据这里的数据得到它包含的两个图标在RT_ICON中的ID。 ”我还不知道咋得到数据。
MoXiaoRab 2010-01-21
  • 打赏
  • 举报
回复
ImageFromIDResource(IDI_ICON4,RT_ICON, m_pImageLinkOn);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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