2009-06-03 2 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 панели, и я должен написать различное целое по каждому из них, есть ли другая альтернатива или как вы предлагаете это сделать? –

+0

@John: Я бы предложил создать элемент управления, который наследуется от Panel, и создать свойство для текста. Просто переопределите OnPaint в вашем элементе управления, чтобы написать строку (используя тот же код). –

+0

Да, но это означает 60 событий OnPaint - от руки. :( –

0

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

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

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

+0

Новая проблема заключается в том, что мне не нужно писать «a», но конкретное целое число и панель не одно, является ли paintEvent единственным способом для этого? –

+0

Сделать это свойство ваш класс и просто нарисуйте значение указанного свойства в OnPaint. –

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)); 
    } 
} 

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

+0

+1: Beat me to it by seconds :) –

+0

Только один вопрос, следует ли мне называть «TextToRender =« myText »« или он получит его сам по себе? –

+1

John: Вам нужно будет установить myPanel1.TextToRender = "a"; myPanel2.TextToRender = "b"; Кроме этого, они «просто сработают» –