4

システムイメージリスト(SHGetFileInfoとSHGFI_LARGEICONを使用)を取得し、独自のアイコンを2つ追加して、TListViewに添付しています。

問題は、ユーザーのアイコンサイズが32x32に設定されていない場合(たとえば、48x48に設定されている場合など)、Delphi7TImageListが「無効な画像サイズ」エラーで失敗することです。

回避策が利用可能かどうか誰かが知っていますか?TPngImageListを使用してみましたが、他の問題が発生します。

また、アイコンのアルファチャンネルを保持したいので注意してください。アイコンは見苦しく見える傾向があるため、通常の1ビットの透明度では不十分です。

ありがとう!

4

3 に答える 3

5

保持できる画像のサイズに制限があることは認識していませんTImageList。あなたの問題は、さまざまなサイズのアイコンがあり、同じ画像リストにさまざまなサイズのアイコンを保持できないことだと思います。

さまざまなサイズのアイコンを使用している場合は、小さいアイコンのサイズを大きくする必要があります。ビットマップを使用してコードで構築する必要があります。ビットマップを純粋な透明アルファ チャネルで塗りつぶし、小さいアイコンをビットマップの中央に配置します。

もう 1 つのオプションは、2 つの個別のイメージ リストを維持することですが、アイコンを同じリスト ビューに描画する必要がある場合は、それではうまくいかないと思います。私の推測では、小さなアイコンを大きくする必要があると思います。

アルファの場合、D7 には ColorDepth プロパティが存在しないため、イメージ リスト ハンドルを自分で作成する必要があります。このため、通常の D7TImageListはアルファ チャンネルを持つアイコンをサポートできません。

ImageList_Createを呼び出し、結果を に渡しILC_COLOR32、代入することで、この制限を回避しImageList.Handleます。これは、画像を追加する前に行ってください。設計時ではなく実行時にリストを設定する必要がありますが、すでに行っているようです。

以下は、アルファ透明度のある 32bpp アイコンを含む 48x48 ツール ボタンのスクリーン ショットです。

画像リストからの 48px アイコン

これを D2010 で作成したのは事実ですが、上記の回避策は D7 でも機能します。ごく最近まで D6 でそのメカニズムを使用していました。画像リストが 48px のアイコンを保持できることを証明するためにこれを示しているだけです。TImageListシステム イメージ リスト コンポーネントの単なるラッパーであるため、あなたが試みていることは完全に実現可能であると思います。

于 2011-01-28T19:14:19.677 に答える
3

このページをあきらめようとしていたとき、解決策にたどり着きました: http://delphihaven.wordpress.com/2010/09/06/custom-drawing-on-glass-2/

どうやら、32x32 より大きいアイコンを Delphi7 の timagelist に追加しようとすると、VCL は「無効な画像サイズ」エラーを表示しますが、himagagelist API を呼び出すだけで簡単に処理できます。

完全なソリューションは次のとおりです。

unit ImageListFix;

interface

uses CommCtrl, Graphics, ImgList;

type
  TImageListFixer = class(TCustomImageList)
  public
    function AddIcon(Image: TIcon): Integer;
  end;

implementation

function TImageListFixer.AddIcon(Image: TIcon): Integer;
begin
  if Image = nil then
    Result := Add(nil, nil)
  else
  begin
    Result := ImageList_AddIcon(Handle, Image.Handle);
    Change;
  end;
end;

end.

そして、システムのイメージリストにアイコンを追加するためのコード:

DocumentImgList:=TImageListFixer(GetSystemLargeIconsList);

IconToAdd:=TIcon.Create;
try
  IconToAdd.Handle := LoadImage(0, 'c:\Ico1.ico', IMAGE_ICON, DocumentImgList.Width, DocumentImgList.Height, LR_LOADFROMFILE);
  DocumentImgList.AddIcon(IconToAdd);

  IconToAdd.Handle := LoadImage(0, 'c:\Ico2.ico', IMAGE_ICON, DocumentImgList.Width, DocumentImgList.Height, LR_LOADFROMFILE);
  DocumentImgList.AddIcon(IconToAdd);
finally
  IconToAdd.Free;
end;
于 2011-01-28T20:15:20.420 に答える
1

TImageList で「無効な画像サイズ」エラーが発生するのは、次の 2 つの条件だけです。

1) TImageList が CreateSize() コンストラクタを介して最初に作成されたときに、TImageList の Height プロパティまたは Width プロパティが 1 未満であるか、Height プロパティが 32768 より大きい場合 (Height および Width プロパティ セッターによるそのような制限はありません)。

2) サイズが TImageList の内部イメージ内に収まらない新しい TBitmap または TIcon を追加または挿入しようとした場合。

于 2011-01-28T22:32:30.280 に答える