【问题标题】:delphi 7 TImage and TImageListdelphi 7 TImage 和 TImageList
【发布时间】:2011-05-17 07:48:15
【问题描述】:

让我成为整数私有

代码

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 的大小?

【问题讨论】:

    标签: delphi delphi-7 timage timagelist


    【解决方案1】:
    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 中。也许GetIcon 在 Delphi 7 中以不同的方式工作。
    • 总之,让我们跳过VCL,原生地做事吧!查看我更新的代码。
    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多