递归导入资源文件Delphi 2007

时间:2013-02-01 22:18:58

标签: delphi delphi-2007

我为Delphi 2007应用程序创建了一个资源文件。资源文件包含10个Bitmap条目。我想知道是否有办法通过递归浏览资源文件将所有位图加载到Imagelist中,或者我是否必须一次将它们拉出一个。

提前致谢。

2 个答案:

答案 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;