J'ai écrit ce qui suit (très simple) commande pour une utilisation dans une application (commentaires supprimés par souci de concision):Qu'est-ce que je fais de mal avec mon contrôle "HorizontalRule" personnalisé?
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 dessiner la ligne de cette façon en fonction du recommendation in the Vista UX guidelines qui suggère un rectangle gravé de hauteur 1 pour les séparateurs.
Lorsque cela est statique, cela semble bien, mais j'ai remarqué que je devrais redessiner les artefacts si je place ce contrôle dans une fenêtre et le redimensionner (via l'ancre, par exemple). Je redessine ma bordure sur toute la largeur de mon rectangle client, mais c'est comme si elle n'était pas réellement peinte. Activer DoubleBuffered dans le constructeur de HorizontalRule, ou sous la forme dans laquelle il est incorporé, ne semble pas non plus faire la différence.
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 cela ne semble pas avoir changé non plus.
Ne pas dessiner l'arrière-plan n'a rien donné d'utile. Je reçois toujours l'artefact, mais je n'obtiens pas la couleur d'arrière-plan alors à la place j'ai vu l'image de ce qui se trouvait sous la ligne horizontale.
Ah, bon endroit :) – leppie