2009-06-03 14 views
5

Estoy tratando de dibujar un texto en un panel (El panel tiene una imagen de fondo).¿Por qué el texto dibujado en un panel desaparece?

Funciona de maravilla, pero cuando minimizo y luego maximizo la aplicación, el texto se va.

Mi código:

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

¿Cómo mantenerlo estático por lo que no se pierde?

Respuesta

2

Si no usa un evento Paint, solo está dibujando en la pantalla donde se encuentra el control. El control no es consciente de esto, por lo que no tiene idea de que el texto se haya quedado allí ...

Si coloca el valor que desea dibujar en el panel en su propiedad Tag, puede usar mismo controlador de eventos de pintura para todos los paneles.

Además, debe deshacerse del objeto Fuente correctamente, o tendrá muchas de ellas esperando a ser finalizadas antes de devolver sus recursos al sistema.

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

Sólo agregar un controlador para el evento Paint:

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

Bueno, no dije todo. Tengo 62 paneles y tengo que escribir un número entero diferente para cada uno de ellos, ¿hay alguna otra alternativa o cómo sugeriría que se hiciera? –

+0

@John: Sugeriría crear un control que herede del Panel y crear una propiedad para el texto. Simplemente anule OnPaint en su control para escribir la cadena (usando el mismo código). –

+0

Sí, pero eso significa 60 eventos OnPaint, a mano. :( –

0

Al dibujar algo, sólo queda hasta la próxima vez que el formulario se actualiza.

Cuando se actualiza el formulario, se llama al evento Paint. Por lo tanto, si quiere asegurarse de que su texto no desaparezca, debe incluir el código que lo dibuja en el evento Paint.

Puede desencadenar un repintado utilizando Control.Invalidate, pero de lo contrario no puede predecir cuándo sucederá.

+0

El nuevo problema es que no tengo que escribir "a", sino un entero específico y el panel no es uno, ¿es la única manera de paintEvent de lograr esto? –

+0

Convertirlo en una propiedad de su clase y simplemente dibujar el valor de dicha propiedad en OnPaint. –

9

Heredar del panel, añadir una propiedad que representa el texto que necesita para escribir, y redefinir la 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)); 
    } 
} 

De esta manera, cada panel se sabe lo que tiene que hacer, y sabrán cómo pintarse a sí mismo

+0

+1: Me adelantó por segundos :) –

+0

Solo una pregunta, ¿debería llamar "TextToRender =" myText "" o lo obtendrá por sí mismo? –

+1

John: Deberá establecer myPanel1.TextToRender = "a"; myPanel2.TextToRender = "b"; Aparte de eso, "simplemente funcionan" –

Cuestiones relacionadas