6

私はこの(単純な)ものに何時間も費やしましたが、解決策が見つかりません:/

D7 と TImageList を使用しています。ImageList はツールバーに割り当てられます。デザインタイムに ImageList にデータを入力すると、アイコン (部分的な透明度) が正常に表示されます。しかし、私は実行時にそれを設定する必要があり、これを行うと、アイコンはかなりくすんだように見えます - 部分的な透明度が完全に失われます.

.res ファイルからアイコンをロードしようとしましたが、同じ結果になりました。サードパーティの画像リストも試しましたが成功しませんでした。私は何ができるか見当もつかない:/ありがとう2すべて;)

編集:

正直なところ、何が起こっているのか正確にはわかりません。アルファブレンディングは正しい用語です...ここに2つのスクリーンがあります:

設計時に追加されるアイコン: (ソース: shs-it.de )代替テキスト

実行時に追加されるアイコン: (ソース: shs-it.de )代替テキスト

アルファブレンディングがサポートされていないというあなたのコメントは、解決策をもたらしました.エディターで画像を編集し、「アルファブレンディング」ピクセルを削除しました-今では問題なく見えます. しかし、設計時ではなく実行時にアイコンが追加されると、アイコンが別のように見えるのはまだ奇妙です。あなた(または他の誰か;)がそれを説明できるなら、私は幸せです;)あなたのサポートに感謝します!

4

3 に答える 3

7

アルファ透明度をサポートするには、画像リストを作成し、実行時に入力する必要があります。

function AddIconFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
  Icon: TIcon;
begin
  Icon := TIcon.Create;
  try
    Icon.LoadFromResourceID(HInstance, ResID);
    Result := ImageList.AddIcon(Icon);
  finally
    Icon.Free;
  end;
end;

function AddPngFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
  Png: TPngGraphic;
  ResStream: TStream;
  Bitmap: TBitmap;
begin
  ResStream := nil;
  Png := nil;
  Bitmap := nil;
  try
    ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
    Png := TPNGGraphic.Create;
    Png.LoadFromStream(ResStream);
    FreeAndNil(ResStream);
    Bitmap := TBitmap.Create;
    Bitmap.Assign(Png);
    FreeAndNil(Png);
    Result := ImageList.Add(Bitmap, nil);              
  finally
    Bitmap.Free;
    ResStream.Free;
    Png.Free;
  end;
end;

// this could be e.g. in the form's or datamodule's OnCreate event
begin
  // create the imagelist
  ImageList := TImageList.Create(Self);
  ImageList.Name := 'ImageList';
  ImageList.DrawingStyle := dsTransparent;
  ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy);
  // populate the imagelist with png images from resources
  AddPngFromResource(ImageList, ...);
  // or icons
  AddIconFromResource(ImageList, ...);

end;
于 2010-06-17T12:18:43.980 に答える
0

ジェレミーが言ったように、これは確かにデルファイの制限です。

ボタン(私の場合はアルファ透明度のPNG)に配置する画像に使用した回避策の1つは、PNGをリソースとして保存し、実行時にclBtnFaceで満たされたボタンサイズのビットマップにペイントすることです。次に、ビットマップがコントロールのグリフとして使用されました。

Delphiの組み込みのアルファマスク付きアイコンのサポートは非​​常に限られていますが、役立つ可能性のある優れたアイコンライブラリキコンがあります。

于 2010-06-17T00:55:17.493 に答える
0

私は数年前にまったく同じ問題を抱えていました。デルファイの問題です。本当はそうしたくありませんでしたが、設計時に画像をリストに入れることになりました。また、最良の結果を得るために DevExpress イメージ リストを使用し、32 ビット カラー イメージを使用する必要がありました。

于 2010-06-16T23:31:38.177 に答える