2009-06-03 72 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個面板,我必須在它們每個上寫不同的整數,是否有另一種選擇,或者你會如何建議這樣做? – 2009-06-03 17:53:52

+0

@John:我會建議創建一個從Panel繼承的控件,併爲該文本創建一個屬性。只需在控件中重寫OnPaint即可寫入字符串(使用相同的代碼)。 – 2009-06-03 17:57:18

+0

是的,但這意味着60個OnPaint事件 - 手動。 :( – 2009-06-03 18:01:45

0

當你畫的東西,它仍然只是下一次的形式被刷新,直到。

當表單刷新時,調用Paint事件。所以如果你想確保你的文本不會消失,你需要包含將它繪製在Paint事件中的代碼。

您可以使用Control.Invalidate觸發重繪,但否則無法預測它們何時會發生。

從面板
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)); 
    } 
} 

這樣,每個小組將知道它需要渲染,並且會知道如何繪畫自己。