2009-06-03 14 views
5

私はパネルにテキストを描画しようとしています(パネルには背景画像があります)。パネル上に描かれたテキストが消えるのはなぜですか?

これは素晴らしい機能ですが、アプリケーションを最小化して最大化すると、テキストは消えてしまいます。

マイコード:

using (Graphics gfx = Panel1.CreateGraphics()) 
{ 
    gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 

どのように私は、静的それを維持しますので、それが失われませんか?

答えて

2

Paintイベントを使用しない場合は、制御が行われる画面上に描画しているだけです。コントロールはこれを認識していないので、テキストがそこにとどまることは意図していませんでした。

パネルに描画する値をTagプロパティに配置すると、すべてのパネルに対して同じペイントイベントハンドラ。

また、Fontオブジェクトを適切に処分する必要があります。そうしないと、リソースをシステムに返す前に多くのオブジェクトがファイナライズされるのを待っています。

private void panel1_Paint(object sender, PaintEventArgs e) { 
    Control c = sender as Control; 
    using (Font f = new Font("Tahoma", 5)) { 
     e.Graphics.DrawString(c.Tag.ToString(), f, Brushes.White, new PointF(1, 1)); 
    } 
} 
4

ただ、Paintイベントのハンドラを追加します:あなたは何かを描くと

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 
+0

私は62枚のパネルを持っていますが、それぞれに異なる整数を書く必要があります。別の選択肢がありますか? –

+0

@ John:Panelから継承し、テキストのプロパティを作成するコントロールを作成することをお勧めします。コントロール内のOnPaintをオーバーライドするだけで、同じコードを使用して文字列を書き込むことができます。 –

+0

はい、それは60個のOnPaintイベントを手作業で意味します。 :( –

0

、それが唯一のフォームが更新される次回まで残ります。

フォームをリフレッシュすると、Paintイベントが呼び出されます。したがって、テキストが消えないようにするには、ペイントイベントに描画するコードを含める必要があります。

Control.Invalidateを使用して再描画をトリガーすることはできますが、それ以外の場合はいつ発生するのか予測できません。

パネルから
+0

新しい問題は、 "a"を書く必要はありませんが、特定の整数とパネルは1つではなく、paintEventはこれを達成する唯一の方法ですか? –

+0

これをプロパティにしますあなたのクラスを作成し、OnPaintでそのプロパティの値を単純に描画します。 –

9

継承は、あなたが書く必要があるテキストを表しプロパティを追加し、上書きOnPaintMethod():

public class MyPanel : Panel 
{ 
    public string TextToRender 
    { 
     get; 
     set; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.DrawString(this.TextToRender, new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
    } 
} 

この方法では、各パネルは、それがレンダリングするために必要なものを知っているだろうが、と知っているだろうそれ自体を塗る方法。

+0

+1:秒で私にそれを打ちなさい:) –

+0

"TextToRender =" myText ""と呼ぶか、 –

+1

John:myPanel1.TextToRender = "a"を設定する必要があります。 myPanel2.TextToRender = "b";それ以外は、 "うまくいく" –

関連する問題