2 votes

Approche des meilleures pratiques pour le contrôle défilable en C# .NET

Je suis en train de concevoir un contrôle Windows forms pour l'édition syntaxique. Je sais qu'il en existe déjà beaucoup, comme par exemple Scintilla , FastColoredTextBox , Actipro Syntaxe Edito r, Avalon Edit etc. J'ai des raisons de concevoir le mien, donc ce n'est pas le problème.

Jusqu'à présent, j'ai conçu l'aspect et la convivialité du contrôle. Il devra être capable de contrôler verticalement et horizontalement.

Les options que j'ai trouvées sont les suivantes :

  1. Mon contrôle étend ScrollableControl o ContainerControl
  2. Mon contrôle instancie un HScrollBar y VScrollBar contrôle et les place en conséquence
  3. Mon contrôle utilise ScrollBarRenderer pour dessiner les barres de défilement de manière personnalisée

Je ne suis pas sûr de savoir laquelle de ces options serait la meilleure pratique pour mon contrôle.

J'ai essayé d'utiliser ScrollableControl y ContainerControl mais cela a donné des résultats très indésirables, probablement parce que les contrôles ont été effectués par le personnel de l'entreprise. DisplayRectangle défilait... Je ne veux pas de ça. Je veux faire défiler un rectangle personnalisé qui contient le texte.

J'ai essayé d'instancier HScrollBar et VScrollBar, mais cela semblait très bogué, et ne fonctionnait pas bien avec le focus et je n'arrivais pas à trouver comment capturer correctement les événements VScroll et HScroll.

J'ai essayé d'utiliser ScrollBarRenderer mais cela semble représenter beaucoup d'efforts simplement pour mettre en œuvre une barre de défilement. De plus, avec cette approche, je devrais toujours capturer et traiter les événements de manière appropriée.

Alors, laquelle de ces approches devrais-je utiliser, ou bien une approche que j'ai peut-être négligée ?

6voto

LarsTech Points 43510

Un ScrollBarRenderer est uniquement utilisé pour dessiner une barre de défilement, il n'effectue aucun calcul ni aucune action de défilement.

Personnellement, je trouve les contrôles HScrollBar et VScrollBar plutôt maladroits à utiliser.

L'héritage du ScrollableControl (ou du Panel pour obtenir une bordure de contrôle Windows intégrée) est probablement le plus simple. Vous utilisez la propriété AutoScrollMinSize pour définir la taille de la surface intérieure, puis vous effectuez une TranslateTransform sur l'objet graphique en utilisant la propriété AutoScrollPosition pour gérer la partie "où" dessiner le contrôle :

public class ScrollControl : ScrollableControl {

  public ScrollControl() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
    this.AutoScrollMinSize = new Size(0, 600);
  }

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

    e.Graphics.Clear(Color.White);
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, 
                                  this.AutoScrollPosition.Y);
    e.Graphics.FillRectangle(Brushes.Red, new Rectangle(16, 32, 64, 32));
  }
}

Attention toutefois, un éditeur de texte syntaxique est une bête différente d'un contrôle de dessin. Je vous conseille d'utiliser un contrôle RichTextBox pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X