我正在尝试在面板上绘制文本(面板具有背景图片)。
它运行得很好,但是当我最小化再最大化应用程序时,文本就消失了。
我的代码:
using (Graphics gfx = Panel1.CreateGraphics())
{
gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
如何使它保持静态,以免丢失?
继承自Panel,添加一个属性来表示您需要写入的文本,并重写OnPaint方法():
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));
}
}
这样,每个面板都将知道它需要渲染的内容,并且将知道如何绘制自己。
只需添加一个Paint事件的处理程序:
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
Paint
事件,则只是在控件所在的屏幕上绘制。控件不知道这一点,因此它不知道您打算让文本留在那里...Tag
属性中,则可以为所有面板使用相同的绘画事件处理程序。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事件。因此,如果您想确保文本不会消失,您需要在Paint事件中包含绘制它的代码。
您可以使用Control.Invalidate触发重绘,但否则无法预测何时会发生。