Почему текст, нарисованный на панели, исчезает? - PullRequest
5 голосов
/ 03 июня 2009

Я пытаюсь нарисовать текст на панели (на панели есть фоновый рисунок).

Это работает блестяще, но когда я свернул, а затем развернул приложение, текст пропал.

Мой код:

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

Как сохранить статичность, чтобы она не потерялась?

Ответы [ 4 ]

9 голосов
/ 03 июня 2009

Наследуйте от 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));
    }
}

Таким образом, каждая панель будет знать, что ей нужно визуализировать, и уметь рисовать сама.

4 голосов
/ 03 июня 2009

Просто добавьте обработчик для события Paint:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1));
}
2 голосов
/ 03 июня 2009

Если вы не используете событие 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));
   }
}
0 голосов
/ 03 июня 2009

Когда вы рисуете что-то, оно остается только до следующего обновления формы.

Когда форма обновляется, вызывается событие Paint. Поэтому, если вы хотите, чтобы ваш текст не исчезал, вам нужно включить код, который рисует его, в событие Paint.

Вы можете запустить перерисовку, используя Control.Invalidate, но в противном случае вы не можете предсказать, когда они произойдут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...