Gráficos.Claro en un Control de formularios Windows forms también se borra el control de sí mismo - ¿cómo evitar esto?

StackOverflow https://stackoverflow.com//questions/10703678

Pregunta

Yo intente dibujar una selección personalizada rectángulo en un Picturebox, utilizando el siguiente método:

    void _drag_UpdateView(bool clearOnly, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("UpdateView");
        using (Graphics g = this.i_rendered.CreateGraphics())
        {
            g.Clear(Color.Transparent);
            if (clearOnly)
                return;
            int px = (_drag_start.X > e.Location.X)?e.Location.X:_drag_start.X;
            int py = (_drag_start.Y > e.Location.Y)?e.Location.Y:_drag_start.Y;
            if (px < 0)
                px = 0;
            if (py < 0)
                py = 0;
            int wx = Math.Abs(e.Location.X-_drag_start.X);
            int wy = Math.Abs(e.Location.Y-_drag_start.Y);
            g.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
        }
    }

Cada vez que llame a:

g.Clear(Color.Transparent);

todo el picturebox se vuelve de color negro.Sin embargo, el rectángulo se dibuja sobre él.Si no me llama ese método, los rectángulos de la pila en sí mismo, por supuesto.Quiero quitar el rectángulo anterior y crear uno nuevo como este.

Nadie puede describir lo que está mal?

¿Fue útil?

Solución

No pinte su control dentro de cualquier otro método de OnPaintBackground o OnPaint.

En realidad puede que lo necesite por razones de rendimiento (tu no actualizar el control total, acaba de cambiar algo sobre la marcha), pero voy a hacer que tu código sea mucho más complicado y siempre vas a necesitar para hacer el mismo trabajo dentro de la Paint evento demasiado (porque puede ser llamado por muchas otras razones por lo que el resultado debe ser el mismo).

Dentro de la Paint no es necesario usar CreateGraphics, el contexto gráfico está dentro de la PaintEventArgs objeto para cambiar su código para:

void DoPainting(object sender, PaintEventArgs e)
{
    // Do your calculations
    e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}

Como se señalaba en @AndersForsgren el uso de la CreateGraphics el método no es común y por lo general, usted no necesita llamar (con la excepción apuntada antes y cuando, por ejemplo, es necesario realizar algunos cálculos basados en los gráficos como para AutoSize).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top