2011-03-31 11 views
5

Estoy elaborando un horario de día y representando ranuras de tiempo con paneles, y las citas son aún más paneles en la parte superior.C# Dibujo en Paneles

El usuario puede desplazarse hacia arriba y hacia abajo para que el rango que puede ver se desplace antes o después. Cuando una cita se ejecuta fuera del rango visible, quiero que haya un zig-zag que indique que la cita se extiende más allá de los límites visibles.

He identificado el caso en el que esto ocurre, y llamo a una función privada drawZigZag(Panel p, int direction); para dibujarlo. El día se extiende horizontalmente, y la dirección -1 indica un zigzag a la izquierda y 1 indica un zigzag a la derecha.

Hasta ahora, todavía no estoy a la altura del zigzag, solo estoy experimentando con CreateGraphics() y FillPolygon(). Hasta ahora tengo:

private void drawZigZag(Panel p, int direction) // 1 = right, -1 = left 
    { 
     Graphics g = p.CreateGraphics(); 

     g.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Black)), p.DisplayRectangle); 

     Point[] points = new Point[4]; 

     points[0] = new Point(0, 0); 
     points[1] = new Point(0, p.Height); 
     points[2] = new Point(p.Width, p.Height); 
     points[3] = new Point(p.Width, 0); 

     Brush brush = new SolidBrush(Color.DarkGreen); 

     g.FillPolygon(brush, points); 
    } 

La primera FillRectangle() yo no tenía originalmente. Solo agregué eso cuando el FillPolygon() no funcionó.

Básicamente, no está funcionando y no estoy seguro de por qué. El panel es del color original, no se ha llenado DarkGreen. He utilizado CreateGraphics() antes para otras cosas, y no estoy muy seguro de por qué no está funcionando en esta instancia. ¿Algunas ideas?

Editar: Lo siento, pensé que debería mencionar: Hay varios controles Label en mi Panel que describen la cita. Estos no deberían estar cubiertos si es posible.

+1

Disculpas si estoy completamente fuera de lugar aquí, pero no parece que estés atando en el ciclo de vida de invalidación/pintura del control. p.ej. suscribirse/anular el evento OnPaint del control en cuestión, etc. – lzcd

+1

Recuerde, sus controles se volverán a pintar cada vez que necesiten ser actualizados. Por lo tanto, si intenta pintar sobre su control en algún momento, se lo volverá a pintar con su aspecto normal para que no vea los cambios. Debe registrar su método de pintura con el evento Paint si desea ver los cambios. –

Respuesta

18

Debe llamar a este método desde el controlador de eventos paint, no solo cuando lo desee. Así que en su constructor es posible que tenga:

panel1.Paint += new PaintEventHandler(panel1_Paint); 

y después de la aplicación:

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     var p = sender as Panel; 
     var g = e.Graphics; 

     g.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Black)), p.DisplayRectangle); 

     Point[] points = new Point[4]; 

     points[0] = new Point(0, 0); 
     points[1] = new Point(0, p.Height); 
     points[2] = new Point(p.Width, p.Height); 
     points[3] = new Point(p.Width, 0); 

     Brush brush = new SolidBrush(Color.DarkGreen); 

     g.FillPolygon(brush, points); 
    } 
1

por ejemplo tenemos este evento dibujo que está dibujando un texto de textBox1:

private void panel1_draw(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     Pen myp = new Pen(System.Drawing.Color.Red, 4); 
     Font fy = new Font("Helvetica", 10, FontStyle.Bold); 
     Brush br = new SolidBrush(System.Drawing.Color.Red); 
     g.DrawString(textBox1.Text, fy, br, 0,0); 
    } 

En Para dibujar en su panel1, debe escribir este código en el controlador de eventos de su botón:

private void button1_Click(object sender, EventArgs e) 
    { 
     panel1.Paint+=new PaintEventHandler(panel1_draw); 
     panel1.Refresh(); 
    } 

La primera línea dibuja el texto en su panel y si desea que aparezca el texto, debe actualizar el panel. Lo principal es utilizar el panel1.Pain + = nuevo PaintEventHandler (su nombre de vació); y panel1.Refresh();