2011-08-13 20 views
12

透明な背景を持つPNGをTImageListにロードし、TMainMenu(TAction経由)で使用したいとします。
しかし、Delphiではバックグラウンドは黒です。 PNGのサポートはDelphiで半分しか実装されていませんか?TMainMenuの透明なPNG画像(TImageList付き)

This男はそれが彼のためではなく、メインメニューのボタンで働いていたと言います。

マイセットアップ:

  • 私のイメージは色ごとに8ビットプラス透明チャンネル(私は透明性のために1ビットでも試してみましたが、まだ動作しません)のために8ビットです。他のプログラムでも画像はきれいに見えます。
  • Delphi XE。
  • TImageListのエディタで、 'transparent color'と 'fill color'が 'Default'に設定され、無効になります。

予期しない動作に注意してください:ユーザーがカラー深度プロパティの値を変更したとき

DELPHIは(TImageListのだけではなく、フォーム全体で)すべての画像を失うことになります。

バグは必要に応じて再現できます。失われた画像は、以前のDFMファイルから 'histoy'フォルダから復元できます。

+1

こんにちは。私はTImageListを使用します。これはDrawingStyleプロパティを持ち、 'transparent'(これはまだ動作していません)にしか設定できません。しかし、cd32bitはありません。 – Ampere

+2

申し訳ありませんが、 'ColorDepth'プロパティが' cd32Bit'に設定されている必要があります。 – RRUZ

+0

更新:ColorDepthプロパティがありますが、 'cd32Bit'に設定した場合、イメージはメニューに表示されなくなります。 – Ampere

答えて

4

は、ソリューションです。あなたのイメージとあなたのDFMファイルもバックアップしてください。

私の場合、100以上の方法があるので、すべての画像を1つずつ書き出して、同じ順序で戻すことはかなり生産的ではありません。

したがって、Delphi XEはまだ透明なPNGファイル(TImageList内)で作業する準備ができていないという結論に達しました。私は古いサードパーティのPNGライブラリに戻ったり、単純なBMPイメージを使用したりするのがよいでしょう。


更新:

そして、これは、Delphi 7の下でそれを行う方法です: http://www.ic0de.org/showthread.php?10477-TUT-Working-with-delphi-s-imagelist-and-transparency

+0

Delphi XEはあなたのリンクに従ってアルファチャンネルのPNGで作業する準備ができています(下記参照)。しかし、TImageListエディタで作業する方法を知っている必要があります。私たちが使用する方法は、すべてのイメージをディレクトリにバックアップし、番号を付けることです。 000_image1.png、001_image2.pngなど。その後、イメージリストをクリアしてこのディレクトリのイメージをリロードするたびに、1つのAdd ...コマンドでイメージを並べ替えることができます。ただし、実行時のテーマが有効になっていなければ、Delphi XEではPNG透過は機能しません。 –

6

デルファイ7以降、私はTPngComponentsを使用していました。これは、デルファイのビルドイン/サードパーティ製コンポーネントのほとんどに非常に優れたpngサポートを提供します。 Embarcaderoは、Open Sources PNG SupportingコンポーネントがTPngImageとして知っていることをよく知っており、Delphiの後のバージョンでDelphiのネイティブグラフィックサポートを構築しています。だから私がDelphi 2010に変更したとき、Delphiはネイティブサポートをテストしていましたが、アルファサポートが十分ではないことがわかりました。

私は再びそのTPngComponentsを使用していましたが、メインメニューを含むほとんどのコンポーネントのサポートが改善されています。私は、そのパッケージは限られた変更でDXEに使えるはずだと思う。

編集:CodeGearの(今エンバカデロ)は、購入した製品を指摘してウーヴェ・ラーベのためのおかげではなく、別のコンポーネントTPngImage TPngComponentました。 http://www.aha-soft.com/faq/delphi-imagelist-png.htm
ように注意してください:これは(任意の追加の通知なく、あなたのTImageListのからのすべての画像を)削除しますので、解決策は唯一のロードわずか数の画像を持っているものです。ここ

+1

ありがとう。だから、それはDelphiのバグです。私は良い古いBMP形式に戻ります。長いDelphiとそれを使って作成できる「最新の」GUIインターフェイス。 – Ampere

+0

PngComponentsはCodeGear(現在はEmbarcadero)によって購入されていません。それはGustavo DaudのPNGサポートだけでした。 PngComponentsは常にMartijn Salyによって作成されたPNGサポートに基づくコンポーネントパッケージでした。現在のバージョンはD2009以降で有効です。 –

+0

@Uwe Rabbeeああ私はチェックし、私はTPngComponentとTPngImageを混ぜた。 Codegear(現在のEmbarcadero)の詳細は、[Nick Hodges Blog](http://blogs.embarcadero.com/nickhodges/2008/08/13/39100)にあります。 Delphiのネイティブサポートが、私が使用していたTPNGComponentと異なるのは問題ありません。それを指摘してくれてありがとうと私は私のメッセージを変更します。 – Justmade

12

バックアップ全体のDFMファイルにない理由はありません。

ImageListに何かをする前に、画像をエクスポートする必要があります:画像リストエディタの「エクスポート」ボタンをクリックすると、すべての画像が1つの.BMPファイルに保存されます。プロパティを変更した後

を:ColorDepth = cd32Bit, DrawingStyle = dsTransparent

をあなたは「追加」ボタンを、あなたは以前にエクスポートしたファイルを選択しクリックする必要があります。その後、画像はメニューとツールバー(少なくともD2010上)で透明に描画されます...サードパーティのコンポーネントを使用する必要はありません。

+1

「エクスポート」ボタンを使って一度にすべてのイメージをエクスポートすると、1つのイメージをどのようにエクスポートできますか? (私の場合、「エクスポート」ボタンは1つの画像のみをエクスポートします) – Ampere

+1

このボタンは2つのことを行うことができます1)「画像」リストで何も選択されていない場合、画像リストのすべての画像をエクスポートします。 2)1つまたは複数のアイコンが選択されている場合、選択したイメージのみがエクスポートされます。 – djsoft

+0

「画像」リストでは、どのように「何も選択しないでください」? 'TImageList'コンポーネントをダブルクリックすると、最初のイメージが常に最初に選択され、** Export **ボタンをクリックすると、そのイメージを1つだけエクスポートするようになります。イメージリスト全体をどのようにエクスポートしますか? –

関連する問題