delphi 如何使用数字名称向TIMageCollection添加图标资源?

oalqel3c  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(141)

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

9rygscc1

9rygscc11#

MAKEINTRESOURCE()只是将一个整数值原样转换为一个字符指针。当直接使用Win32 FindResource() API时,这很好用,因为它接受这样的字符指针作为资源名称。但是,这不适用于任何采用Delphi风格的String作为资源名称的东西,因为String需要一个字符指针指向一个C风格的空终止字符串,这不是MAKEINTRESOURCE()返回的指针类型。
所以,要做你想做的事,你有两个选择:

  • 根据FindResource()文档,以"#<ID>"字符串格式指定数字资源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;
    }
}

相关问题