5

コードをDelphiXE(Delphi 7から)にアップグレードし、不要なライブラリをすべて削除しようとしています。私は長年PNGComponentsを使用してきましたが、次に進んでネイティブのTImageListとTPNGImageを使用します。

私のコードの一部は、リンクされたリソースから実行時に画像リストをロードします。このための私の作業中のPNGComponentsコードは次のとおりです。

function CreateAndLoadImageList( ASize : integer ) : TPngImageList;
var
  PngObject : TPngObject;
  I : integer;
begin
  Result := TPngImageList.Create( nil );

  Result.BeginUpdate;
  try

    Result.Width := ASize;
    Result.Height := ASize;

    PngObject := TPngObject.create;
    try

      For I := 0 to Length( ArtImageNames ) -1 do
        begin
        PngObject.LoadFromResourceName( hInstance, Format( 'AImg%d_%d', [ASize, I]));

        Result.PngImages.Add( False).PngImage := PngObject;
        end;

    finally
      PngObject.Free;
    end;


  finally
    Result.EndUpdate;
  end;

end;

この質問の答えを使用して、おそらくマスクが失われたために、画像を表示しているが背景が黒である以下のコードを試しています。ImageList_Addに渡すためにマスクビットマップが必要だと思います。ここで「0」はありますが、私はこのようなものが苦手です。誰かが私がこれを機能させる方法を知っていますか?

function CreateAndLoadImageList( ASize : integer ) : TImageList;
var
  PngImage : TPngImage;
  bmp : TBitmap;
  I : integer;
begin

  Result := TImageList.Create( nil );
  Result.Masked := False;
  Result.DrawingStyle := dsTransparent;

  Result.BeginUpdate;
  try

    Result.Width := ASize;
    Result.Height := ASize;
    Result.Masked := False;

    PngImage := TPngImage.create;
    try

      For I := 0 to Length( ArtImageNames ) -1 do
        begin
        PngImage.LoadFromResourceName( hInstance, Format( 'AImg%d_%d', [ASize, I]));


        bmp:=TBitmap.Create;
        PngImage.AssignTo(bmp);

        bmp.AlphaFormat:=afIgnored;

        ImageList_Add( Result.Handle, bmp.Handle, 0);
        Bmp.Free;

        end;
    finally
      PngImage.Free;
    end;


  finally
    Result.EndUpdate;
  end;

end;
4

1 に答える 1

2

PNG画像は、アルファチャネルを使用して部分的に透明になります。彼らはマスクを使用しません。あなたの問題は、画像リストにアルファを保持していないことだと思います。

  • 画像リストをに設定する必要がありColorDepthますcd32Bit
  • PNG画像をビットマップに割り当てると、ビットマップのプロパティが正しく設定されると思いますので、AlphaFormatを設定する行を削除してください。

余談ですが、Assignではなく使用することを目的としていますAssignToAssignToは、の穏やかな形式のダブルディスパッチを可能にする内部メソッドですTPersistent

于 2011-05-04T11:54:32.987 に答える