我有一个用 visual studio 创建的资源文件,我正在使用 C++ Builder,示例条目:
IDI_ICON1 ICON "filename.ico"
我尝试使用
TImageCollection
和 "101"
中的值将其加载到 "IDI_ICON1"
,因为 MAKEINTRESOURCE()
无法作为参数提供,但它不起作用。 Add()
在下面都不起作用,说找不到。
for (UINT i=IDI_USER_ICON_START; i<=IDI_USER_ICON_END; i++) {
String resname=String::Format("IDI_ICON%u", ARRAYOFCONST((i-(IDI_USER_ICON_START-1))));
//ImageCollection->Add(resname, reinterpret_cast<NativeUInt>(HInstance), resname);
ImageCollection->Add(resname, reinterpret_cast<NativeUInt>(HInstance), String::Format("%u",ARRAYOFCONST((i))));
}
如何使用数字名称处理加载
ICON
资源?
MAKEINTRESOURCE()
简单地将整数值按原样转换为字符指针。这在直接使用 Win32 FindResource()
API 时工作正常,因为它接受这样的资源名称字符指针。但是,这不适用于任何采用 Delphi 风格 String
作为资源名称的东西,因为 String
需要字符指针指向 C 风格的空终止字符串,这不是那种指针MAKEINTRESOURCE()
返回。
所以,做你想做的,你有两个选择:
"#<ID>"
文档,以
FindResource()
字符串格式指定数字资源 ID,例如:for (UINT i = IDI_USER_ICON_START; i <= IDI_USER_ICON_END; ++i) {
String imgname = String().sprintf(L"IDI_ICON%u", (i-IDI_USER_ICON_START)+1);
String resname = String().sprintf("#%u", i);
ImageCollection->Add(imgname, reinterpret_cast<NativeUInt>(HInstance), resname);
}
Add()
需要一个 RCDATA
资源而不是 ICON
资源 - 我现在无法验证),那么使用 Add()
的重载需要一个TStream
而不是资源名称。然后你可以传递给它一个TResourceStream
,它有一个构造函数,它接受一个数字资源ID和一个资源类型,例如:for (UINT i = IDI_USER_ICON_START; i <= IDI_USER_ICON_END; ++i) {
String imgname = String().sprintf(L"IDI_ICON%u", (i-IDI_USER_ICON_START)+1);
TResourceStream *Strm = new TResourceStream(reinterpret_cast<NativeUInt>(HInstance), i, RT_ICON);
try {
ImageCollection->Add(imgname, Strm);
}
__finally {
delete Strm;
}
}