2017-09-08 9 views
1

通常のTImageコンポーネントをフォームまたはパネル上の他のコンポーネントに配置すると、画像がロードされない限り、実行時に非表示になります。その下の他のものが見えます。Delphi TImage32 - 画像がロードされていない場合、コンポーネントを非表示にするにはどうすればいいですか?

しかし、TImage32はデフォルトで灰色のボックスをペイントしています。

どのように私は設定を残している間、それを非表示にしますか:.Visible:= True;画像がロードされていない場合は?
(私はまだ...クリック時のような構成要素に取り組んでイベントを、必要とする)

はい、これは重複して質問ですが、previous topicからsolution-linkが死んでいます。 :(

答えて

1

私はニュースグループの投稿にまだアクセスしていますが、トピックIDがどのようにトピックタイトルに関連しているのか分かりませんが、ニュースグループの検索に基づいて

このコンポーネントは、もはや維持されていませんが、このコンポーネント(コアライブラリの一部ではありません)は、

まず、TImage32は常にそのバッファの内容をディスプレイにペイント(コピー)する必要があります。これは、このコンポーネントの背後にあるどのグラフィックがdによって上書きされるかを意味します。失敗。

トリックTImage32Exは親コンテンツを取得し、それをバッファに描画します。コードはこの

var 
    P: TPoint; 
    SaveIndex: Integer; 
begin 
    SaveIndex := SaveDC(Buffer.Handle); 
    try 
    GetViewportOrgEx(Buffer.Handle, P); 
    SetViewportOrgEx(Buffer.Handle, P.X - Left, P.Y - Top, nil); 
    IntersectClipRect(Buffer.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight); 
    Parent.Perform(WM_ERASEBKGND, Buffer.Handle, 0); 
    Parent.Perform(WM_PAINT, Buffer.Handle, 0); 
    finally 
    RestoreDC(Buffer.Handle, SaveIndex); 
    end; 
end; 

のように見えますadaptionsで

上記のコードは(WM_PAINT)バッファへの親のコンテンツを描画します。例えば

あなたは単に「PaintBuffer」ハンドラに次のコードを追加しますPaintBox32呼ばTPaintBox32インスタンスを透明にするようにしたい場合:

procedure TForm3.PaintBox32PaintBuffer(Sender: TObject); 
var 
    P: TPoint; 
    SaveIndex: Integer; 
begin 
    SaveIndex := SaveDC(PaintBox32.Buffer.Handle); 
    try 
    GetViewportOrgEx(PaintBox32.Buffer.Handle, P); 
    SetViewportOrgEx(PaintBox32.Buffer.Handle, P.X - PaintBox32.Left, P.Y - PaintBox32.Top, nil); 
    IntersectClipRect(PaintBox32.Buffer.Handle, 0, 0, PaintBox32.Parent.ClientWidth, PaintBox32.Parent.ClientHeight); 
    PaintBox32.Parent.Perform(WM_ERASEBKGND, PaintBox32.Buffer.Handle, 0); 
    PaintBox32.Parent.Perform(WM_PAINT, PaintBox32.Buffer.Handle, 0); 
    finally 
    RestoreDC(PaintBox32.Buffer.Handle, SaveIndex); 
    end; 
end; 

注:これは基本的に動作しますが、それは捕獲しない場合があります親のサブコントロールが適切に表示されます。 TWinControlの子孫の場合は特にそうです。このシナリオをカバーする解決策はありますが、これを詳細にカバーすることははるかに複雑です(例えば、基礎となるTEditインスタンスの点滅カーソル)

0

私は、プログレスバーをマスクして、形状。

透明である部分をpngに読み込んで、それをプログレスバーの上に置きます。

私はこれがあなたの目標を達成するはずだと思います。あなたの時間に透明なPNGを置きます。

乾杯、 E.

関連する問題