6

背景画像 (Form1.Repaint のフォームに描画) を持つフォームがあります。

私が探しているもの:ロードされた画像をスムーズにサイズ変更(リサンプル)できる透明な画像コントロール。

(フォームの背景画像が透けて見えるはずなので、透明にする必要があります)

私が試したこと:

  • 標準 TImage:透明ですが、再サンプリングしません。

  • Graphics32 / Image32:美しくリサンプルしますが、透明ではありません。

    修正または回避策を求めて数時間グーグルで検索しましたが、解決策はほとんどありません. これは、Image32 に読み込まれた画像が透明であることとは関係ありませんが、代わりに、コントロールの背景色がまだ白のままです (白 = Image32 コントロールの色プロパティであり、それを clNone に設定しても機能しません)。これは明らかに設計どおりです

  • GR32ex (The GR32 Extension Components Pack) は、透過プロパティを追加すると思われますが、長年更新されておらず、インストールできません。Delphi 2010 および Graphics32 v. 1.9 で膨大な数のエラーがスローされます。

誰かが解決策または回避策を考えることができますか? 私が欲しいのは、透明性とリサンプリングを備えたコントロールだけです。

ありがとう!

4

1 に答える 1

6

TImage32透明化をしないことに驚きました。本当にそうですか?

とにかく、そうであれば、 の透過性サポートTImageと のリサンプリング機能を組み合わせて、TBitmap32その方法でソリューションを構築します。元の画像をTBitmap32インスタンスに保持します。TImageサイズ変更など、コンポーネントにロードする必要があるときはいつでも、 を使用TBitmap32してメモリ内のサイズ変更を実行し、サイズ変更された画像をロードします。

実際、フォームの背景を自分でペイントしている場合は、自分でイメージをペイントして、イメージ コントロールを削除してみませんか?

更新 1: Websearch により、TImage32 を透明にする簡単な方法が明らかになりました: http://graphics32.org/news/newsgroups.php?art_group=graphics32.general&article_id=9505

更新 2:上記のリンクは現在無効であり、ニュースグループには NNTP 経由でのみアクセスできます。100%確実とは言えませんが、リンクされた投稿は Michael Haralabos によるもので、次のファイルが含まれていたと思います。

unit GR32_ImageEx;

// Transparent TImage32 by Michael Haralabos

interface

uses
  Windows, Messages, Classes, GR32_Image, GR32;

type
  TImage32Ex = class(TImage32)
  private
    FTransparent: Boolean;

    procedure SetTransparent(const Value: Boolean);
  public
    procedure ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer); override;
  published
    property Enabled;
    property Transparent: Boolean read FTransparent write SetTransparent;
  end;

procedure Register;

implementation

procedure TImage32Ex.ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer);
var
  P: TPoint;
  SaveIndex: Integer;
begin
  if FTransparent and Assigned(Parent) and
     not (Assigned(Bitmap) and (BitmapAlign = baTile)) then
  begin
    SaveIndex := SaveDC(Dest.Handle);
    GetViewportOrgEx(Dest.Handle, P);
    SetViewportOrgEx(Dest.Handle, P.X - Left, P.Y - Top, nil);
    IntersectClipRect(Dest.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
    Parent.Perform(WM_ERASEBKGND, Dest.Handle, 0);
    Parent.Perform(WM_PAINT, Dest.Handle, 0);
    RestoreDC(Dest.Handle, SaveIndex);
  end
  else
    inherited;
end;

procedure TImage32Ex.SetTransparent(const Value: Boolean);
begin
  if FTransparent <> Value then
  begin
    FTransparent := Value;
    Invalidate;
  end;
end;

procedure Register;
begin
  RegisterComponents('Graphics32', [TImage32Ex]);
end;

end.

ここでの別のトピックは、これが現在デッドリンクが参照しているものである可能性があることを示唆しています: Delphi TImage32 - 画像が読み込まれていない場合にコンポーネントを非表示にする方法は?

于 2012-06-25T16:59:06.570 に答える