如何使用数字名称将图标资源添加到 TImageCollection?

问题描述 投票:0回答:1

我有一个用 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
资源?

delphi c++builder
1个回答
1
投票

MAKEINTRESOURCE()
简单地将整数值按原样转换为字符指针。这在直接使用 Win32
FindResource()
API 时工作正常,因为它接受这样的资源名称字符指针。但是,这不适用于任何采用 Delphi 风格
String
作为资源名称的东西,因为
String
需要字符指针指向 C 风格的空终止字符串,这不是那种指针
MAKEINTRESOURCE()
返回。

所以,做你想做的,你有两个选择:

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.