Question

J'ai écrit ce qui suit (très simple) commande pour une utilisation dans une application (commentaires supprimés par souci de concision):

public partial class HorizontalRule : Control
{
    public HorizontalRule()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        var g = e.Graphics;

        var rect = new Rectangle(
            this.ClientRectangle.Left,
            this.ClientRectangle.Height / 2 + 1, 
            this.ClientRectangle.Width,
            1);

        ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched);

        return;
    }
}

Disclaimer:. Je suis un débutant à la peinture mes propres contrôles

J'ai choisi de tracer la ligne de cette façon basée sur la recommandation dans Vista directives UX qui suggère un rectangle gravé de hauteur 1 pour les séparateurs.

Lorsque statique, cela ressemble bien, mais je l'ai remarqué que je me redessiner des objets si je place ce contrôle dans une fenêtre et redimensionnez (via l'ancre, par exemple). Je redessiner ma frontière sur la largeur de tout mon rectangle client, mais il est comme il est pas réellement peint. Activation DoubleBuffered dans le constructeur de HorizontalRule, ou sous la forme qu'il est intégré dans, ne semble pas faire une différence non plus.

Qu'est-ce que je fais mal?

Mise à jour:

Par la suggestion, j'ai essayé d'appeler base.OnPaint dernier au lieu de la première. Je ne sais pas ce que cela aurait changé, et il ne semble pas avoir rien changé non plus.

dessin Pas l'arrière-plan rien accompli utile. Je reçois toujours le artifacting, mais je ne suis pas aussi la couleur de fond de sorte qu'au lieu que j'ai vu l'image de tout ce qui était en dessous de la ligne horizontale.

Était-ce utile?

La solution 2

Je peux pirater une solution qui ne donne pas lieu à artifacting en remplaçant OnResize () pour invalider le contrôle entier:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);

    this.Invalidate();
}

Je ne suis pas sûr que ce soit la « bonne » solution, cependant.

Autres conseils

Dont appel base.OnPaint, ou appeler la dernière (je ne peux pas rappeler maintenant).

En outre, essayez redéfinissant la méthode de peinture de fond, il ne remet pas la base.

Je tirerais cela sur un bitmap puis dessinez le bitmap au lieu de se soucier de la peinture chaque fois.

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