【问题标题】:Why does text drawn on a panel disappear?为什么在面板上绘制的文字会消失?
【发布时间】:2009-06-04 03:51:56
【问题描述】:

我正在尝试在面板上绘制文本(面板有背景图片)。

效果很好,但是当我最小化然后最大化应用程序时,文本消失了。

我的代码:

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

如何让它保持静止,以免丢失?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    从Panel继承,添加一个代表你需要写的文本的属性,并重写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));
        }
    }
    

    这样,每个 Panel 都会知道它需要渲染什么,并且会知道如何绘制自己。

    【讨论】:

    • 只有一个问题,我应该调用 "TextToRender = "myText"" 还是它自己会得到它?
    • John:你需要设置 myPanel1.TextToRender = "a"; myPanel2.TextToRender = "b";除此之外,它们会“正常工作”
    • 第 9 行出现错误“找不到合适的方法来覆盖” - ovveride 方法。
    • 你可能忘记从面板继承了。
    【解决方案2】:

    只需为 Paint 事件添加一个处理程序:

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

    【讨论】:

    • 好吧,我没说完。我有 62 个面板,我必须在每个面板上写不同的整数,还有其他选择吗?或者您建议如何做?
    • @John:我建议创建一个从 Panel 继承的控件,并为文本创建一个属性。只需覆盖控件中的 OnPaint 即可写入字符串(使用相同的代码)。
    • 是的,但这意味着 60 个 OnPaint 事件 - 手动。 :(
    • @John:我想你误会了。您创建了一个派生自 Panel 的新控件,该控件实现了绘制,然后有一个属性指定它应该绘制的数字。然后,您只需在需要的地方使用该新控件代替 Panel 并提供属性值。
    【解决方案3】:

    如果您不使用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 事件。所以如果你想确保你的文本不会消失,你需要在 Paint 事件中包含绘制它的代码。

      您可以使用 Control.Invalidate 触发重绘,但您无法预测它们何时会发生。

      【讨论】:

      • 新的问题是我不必写“a”,但是一个特定的整数和面板不是一个,是paintEvent唯一的方法来完成这个吗?
      • 让它成为你的类的属性,然后简单地在 OnPaint 中绘制所述属性的值。
      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多