我为Delphi 2007应用程序创建了一个资源文件。资源文件包含10个Bitmap条目。我想知道是否有办法通过递归浏览资源文件将所有位图加载到Imagelist中,或者我是否必须一次将它们拉出一个。
提前致谢。
答案 0 :(得分:5)
要将当前模块中的所有RT_BITMAP
资源类型图像添加到图像列表,我将使用此:
uses
CommCtrl;
function EnumResNameProc(hModule: HMODULE; lpszType: LPCTSTR; lpszName: LPTSTR;
lParam: LONG_PTR): BOOL; stdcall;
var
BitmapHandle: HBITMAP;
begin
Result := True;
BitmapHandle := LoadBitmap(HInstance, lpszName);
if (BitmapHandle <> 0) then
begin
ImageList_Add(HIMAGELIST(lParam), BitmapHandle, 0);
DeleteObject(BitmapHandle);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumResourceNames(HInstance, RT_BITMAP, @EnumResNameProc,
LONG_PTR(ImageList1.Handle));
end;
答案 1 :(得分:3)
我猜测用&#34;递归地浏览资源文件&#34;你想问的是可以在不知道名字的情况下加载资源。为此,有一类API函数允许您枚举给定模块中的资源。有关详细信息,请参阅"Resource Overviews, Enumerating Resources"主题。
但是,由于您自己将位图嵌入到exe中,因此更容易为它们提供允许轻松迭代的名称,即在RC
文件中:
img1 BITMAP foo.bmp
img2 BITMAP bar.bmp
这里的名字&#34;模式&#34;是img
+数字。现在很容易将图像加载到循环中:
var x: Integer;
ResName: string;
begin
x := 1;
ResName := 'img1';
while(FindResource(hInstance, PChar(ResName), RT_BITMAP) <> 0)do begin
// load the resource and do something with it
...
// name for the next resource
Inc(x);
ResName := 'img' + IntToStr(x);
end;