Graphics.Clear sur un contrôle Windows Form efface également le contrôle lui-même – comment éviter cela ?

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

Question

J'essaie de dessiner un rectangle de sélection personnalisé sur une Picturebox, en utilisant la méthode ci-dessous :

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

Chaque fois que j'appelle :

g.Clear(Color.Transparent);

toute la boîte à images devient noire.Cependant, le rectangle est dessiné dessus.Si je n'appelle pas cette méthode, les rectangles s'empilent sur eux-mêmes, bien sûr.Je souhaite supprimer l'ancien rectangle et en créer un nouveau comme celui-ci.

Quelqu'un peut-il décrire ce qui ne va pas ?

Était-ce utile?

La solution

Ne peignez pas votre contrôle à l'intérieur d'une autre méthode que OnPaintBackground ou OnPaint.

En fait, vous en aurez peut-être besoin pour des raisons de performances (vous n'actualiserez pas le contrôle complet, vous changerez simplement quelque chose à la volée), mais cela rendra votre code beaucoup plus délicat et vous devrez toujours faire le même travail à l'intérieur du Paint événement également (car il peut être appelé pour de nombreuses autres raisons et le résultat doit donc être le même).

À l'intérieur de Paint vous n'avez même pas besoin d'utiliser CreateGraphics, le contexte graphique est à l'intérieur du PaintEventArgs objet alors changez votre code en :

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

Comme l'a souligné @AndersForsgren pour utiliser le CreateGraphics La méthode n'est pas courante et vous n'avez généralement pas besoin de l'appeler (à l'exception indiquée avant et lorsque, par exemple, vous devez effectuer des calculs basés sur les graphiques comme pour AutoSize).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top