Delphi 7中的TImage和TImageList

3

让i成为私有整数

代码

procedure TForm1.Image1Click(Sender: TObject);
begin
  inc(i);
  ImageList1.GetIcon(i mod 4,Image1.Picture.Icon);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  i:=0;
  ImageList1.GetIcon(i mod 4,Image1.Picture.Icon);
end;

如何拉伸列表中的图标以适应Image1的大小?
1个回答

6
procedure TForm1.Image1Click(Sender: TObject);
var
  icon: TIcon;
begin
  inc(i);
  Image1.Canvas.FillRect(ClientRect);      
  icon := TIcon.Create;
  try
    ImageList1.GetIcon(i mod 4, icon);
    DrawIconEx(Image1.Canvas.Handle, 0, 0, icon.Handle, Image1.Width, Image1.Height, 0, 0, DI_NORMAL);
  finally
    icon.Free;
  end
end;

更好的方法

有时使用Delphi会有些尴尬,因为VCL和本地Windows API之间的合作范围有点不清楚。如果上面的代码不起作用(我感觉它会泄漏图标),这里是一种纯本地方法(uses ImgList,CommCtrl):

procedure TForm1.Image1Click(Sender: TObject);
var
  icon: HICON;
begin
  inc(i);
  Image1.Canvas.FillRect(ClientRect);
  icon := ImageList_GetIcon(ImageList1.Handle, i mod 4, ILD_NORMAL);
  try
    DrawIconEx(Image1.Canvas.Handle, 0, 0, icon, Image1.Width, Image1.Height, 0, 0, DI_NORMAL);
  finally
    DestroyIcon(icon);
  end
end;

如果您更改代码并删除图标:= TIcon.create和icon.free;这行,那么这段代码将像魅力一样工作,我会将其标记为答案。 - none
删除这些行将使代码无法工作...... 至少在Delphi 2009中是这样。也许在Delphi 7中,GetIcon的工作方式不同。 - Andreas Rejbrand
无论如何,让我们跳过VCL并本地化处理!请查看我的更新代码。 - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接