2011-12-18 9 views
2

テキストをキャンバスにペイントすれば、何度も再ペイントしなくてもテキストが再描画/更新/それはイメージとして描かれ、一時的に描かれていないようです。Delphi - テキストをペイントして、画像を再ペイントした後に消えないようにします。

+0

どのキャンバスに絵を描いているかによって異なります。カスタムコントロールで作業している場合は、1つの方法があります。しかし、あなたのフォームのキャンバスのようなもので作業しているなら、それは別の話です。 –

答えて

6

たとえば、TPaintBoxコントロールなどの話をしている場合は、ペイントする永続キャンバスはありません。システムは単にそのように設計されておらず、VCLコントロールは基礎となるWindowsフレームワークを反映しています。

  1. ペイントを最初オフスクリーンビットマップに次のよう

    正常なアプローチです。

  2. システムが再描画を要求すると、オフスクリーンビットマップをスクリーンキャンバスに描画します。

このアプローチにつながるさまざまな理由があります。多くの場合、パフォーマンスが要因です。ペイントするのは高価な場合があり、画像をキャッシュすると助けになります。場合によってはペイントするために必要な情報が一時的なものになることがあり、出力を再度キャッシュすることが解決策になることがあります。

4

できません。ペインティングは、画面上の画像を1回だけ表示します。あなたがそれを維持したい場合は、は、OSが要求するたびにを書き直す必要があります。

0

TLabel(または何らかの派生品)を使用してキャンバス上に置きます。 TLabelは、必要に応じていつでも再描画されます。

+0

Askerは、テキストをTCanvasに描画することを指しています。彼らがキャンバスを使ってラベルの代わりにテキストを描いているのは、実現可能な理由があるに違いありません。 –

0

システムがあなたに指示するときにのみ描画する必要があります。この主題と知っている2つのもの...

キャッシュ

あなたはまた、独自のキャッシュシステムを実装することができますがあります。これは、多くのレイヤーを扱うときにややこしいことになります。高い割合で変化すると予想される特定の領域があるかもしれません。そして、バックグラウンドは、サイズ変更されていないか、色が変わっていない限り、おそらく変更されません。 2つの異なる画像オブジェクトをバックグラウンドで維持し、それらを結合して、少なくとも上のものが透明であることを確認してください。

Invalidateコマンドを使用して、コントロールのキャッシュが無効になったときに(次の件名...)Windowsに通知することもできます。これにより、コントロール内の何かがすべてを再描画する必要がある場所に変更されたことがWindowsに通知されます。 Paintプロシージャを呼び出すことによって、実際にコントロールが再びペイントされるように指示する準備が整った時点で、Windowsが決定します。ダビデは彼の答えに言及したように、システムは、あなたがすべきと言うとき、あなたはあなたの背景を再描画する必要があり、コントロールで作業している場合、システムは、

ペイント

。これは、TGraphicControlまたはTCustomControl(および他のもの)からPaint手順を継承することによって達成されます。このプロシージャは、コントロールの内容をリフレッシュする必要があるとシステムが指示するたびに呼び出されます。これは、キャッシュが無効になったときにシステムに通知する方法です。一方

procedure Paint; override; 
... 
procedure TMyCustomControl.Paint; 
begin 
    DoSomeDrawingOnCanvas; 
end; 

あなたはそれがあまりにもこのPaintプロシージャをコールしたいときは、Windowsを伝えることができます...

procedure TMyCustomControl.SetWidth(const Value: Integer); 
begin 
    if Value <> FWidth then begin //Just a common check for performance reasons 
    FWidth:= Value; 
    Invalidate; //This tells Windows that you want to repaint your control 
    end; 
end; 
関連する問題