我試圖在面板上繪製文本(面板有背景圖片)。爲什麼在面板上繪製的文本消失?
它的工作非常出色,但是當我最小化然後最大化應用程序時,文本消失了。
我的代碼:
using (Graphics gfx = Panel1.CreateGraphics())
{
gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
我如何保持靜態的,所以它不會迷路?
我試圖在面板上繪製文本(面板有背景圖片)。爲什麼在面板上繪製的文本消失?
它的工作非常出色,但是當我最小化然後最大化應用程序時,文本消失了。
我的代碼:
using (Graphics gfx = Panel1.CreateGraphics())
{
gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
我如何保持靜態的,所以它不會迷路?
如果您沒有使用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));
}
}
只需添加一個處理程序Paint事件:
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
當你畫的東西,它仍然只是下一次的形式被刷新,直到。
當表單刷新時,調用Paint事件。所以如果你想確保你的文本不會消失,你需要包含將它繪製在Paint事件中的代碼。
您可以使用Control.Invalidate觸發重繪,但否則無法預測它們何時會發生。
從面板繼承,可以添加一個代表你需要編寫文本的屬性,並覆蓋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));
}
}
這樣,每個小組將知道它需要渲染,並且會知道如何繪畫自己。
嗯,我沒有說一切。我有62個面板,我必須在它們每個上寫不同的整數,是否有另一種選擇,或者你會如何建議這樣做? – 2009-06-03 17:53:52
@John:我會建議創建一個從Panel繼承的控件,併爲該文本創建一個屬性。只需在控件中重寫OnPaint即可寫入字符串(使用相同的代碼)。 – 2009-06-03 17:57:18
是的,但這意味着60個OnPaint事件 - 手動。 :( – 2009-06-03 18:01:45