Mon TreeView entièrement fait à la main - 1er Control et plein de questions

mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011 - 9 avril 2010 à 23:37
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011 - 11 avril 2010 à 22:44
Bonjour !
Je n'ai pas vraiment (encore) de problème particulier, mais je souhaitais vous présenter la progression de mon travail dans la création d'un TreeView entièrement fait à la main.
J'espère que je suis dans la bonne section pour présenter ce genre de WIP, étant donné que je n'ai pas trouvé de section plus adaptée.

Commencant tout juste à utiliser le vrai TreeView de VB.net, je me suis vite retrouvé embetté quand j'ai voulu surcharger les méthodes de dessin.
De plus, étant débutant, je m'emellait vite les pinceaux quand j'essayais de créer une classe héritant de ce vrai TreeView. Et comme j'aime faire joujou avec GDI, je suis donc reparti de zéro.

Voilà où j'en suis pour l'instant et ce que ça donne visuellement:



J'ai donc:
-> une classe "cTreeView" héritant de "ScrollableControl" qui gère le dessin des noeuds. Elle gère aussi la sélection des noeuds et les évènements.

-> une classe "cTreeNode" qui n'hérite de rien.Elle sert juste à stocker toutes les propriétés de chaque noeud et chaque instance de cette classe contient une instance de "cTreeNodeCollection".

-> une classe "cTreeNodeCollection" héritant de "List(Of cTreeNode)". Elle sert évidemment à stocker la liste des noeuds enfants de chaque noeud.

-> une classe "cTreeViewEventArgs" pour créer un évènement "SelectedNodeChanged" et pouvoir récupérer le noeud actuellement sélectionné.


Voilà pour la présentation. Je mettrais surement au fur et à mesure un lien dans ce topic vers les sources quand elles seront présentables, et au final, je mettrais surement tout ça dans les vraies sources si j'arrive à mes fins .

En attendant, j'ai tout de même pas mal d'interrogations. Que ce soit au niveau des performances ou de la bonnes façon de faire les choses. Actuellement, les principales actions du TreeView fonctionnent. Je peux ajouter des noeuds et des sous-noeuds facilement. J'arrive à gérer "expand" et "collapse" ainsi que le calcul du scroll. J'ai aussi ajouté les propriétés ImageList/ImageIndex/SelectedImageIndex.


Première question qui me taquine au niveau des performances...
-> Je dessine déjà les lignes hiérarchiques, et les petites flèches entièrement avec GDI. Je m'apprête à faire pareil avec les icons "plus et moins", mais je me demande si ça ne serait pas moins lourd d'utiliser une image en mémoire que j'insèrerais dans les ressources du control au final. Qu'est ce qui serait le mieux d'après vous? Charger une image et la peindre avec GDI au bon endroit ou alors tout dessiner avec les méthodes GDI ?

-> Un peu la même question pour les checkBox sur les nodes que je vais bientôt rajouter. J'ai bien envie de tout gérer en GDI moi même, mais serait-il plus raisonable d'ajouter directement des vrais checkBox ?

Voilà. déjà pour l'introduction j'écris des romans . Avant de vous montrer les horreurs de codage que j'aurais pu faire, vouq aurez remarqué que je me pose pas mal de questions existentielles .

Le but de ce topic est donc que je progresse en prenant plus de bonnes habitudes, surtout dans la façon d'écrire mes classes, et j'attends donc vos conseils, remarques et critiques

7 réponses

cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
10 avril 2010 à 01:17
Au final tu refais un contrôle juste pour changer son thème. C'est là qu'on voit que WPF est bien. Autrement le rendu à l'air pas mal.
0
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
10 avril 2010 à 12:34
Merci GG29. Oui effectivement, je refais le contrôle pour pouvoir gérer complètement le dessin comme je l'entends. C'est aussi un petit chalenge pour moi, car honnêtement, je ne pensais pas pouvoir arriver jusque là.

Ca me permettra également de dériver la base pour le dessiner autrement. Par exemple style "arbre généalogique".

WPF je ne connais pas assez pour pouvoir en parler, mais à ce que j'en avais entrevu, c'est vrai que ça a l'air totalement différent et plus pratique au niveau du graphisme. J'ai déjà vu aussi qu'on pouvait inclure des contrôles WPF dans une appli en Winforms, mais est-ce vraiment conseillé ?

Si quelqu'un avait un avis au niveau du dessin de mes checkBox, ce serait sympa, car je vais me lancer dedans là. Est-ce plus raisonable et moins lourd d'ajouter de vrais checkBox ou je peux aisément peindre ça en GDI sans faire ramer beaucoup plus.

Sinon je prends aussi des infos au niveau de la propriété "HotTracking" du vrai TreeView. J'ai pas vraiment compris l'intérêt de cette propriété.Ca sert uniquement à donner un effet de lien html au survol ou y'a t-il une vraie utilité?
0
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
10 avril 2010 à 12:53
En gros WPF te permet de modifier le template de tous les contrôles et ce très facilement. Et en effet on peut inclure des contrôles WPF dans des fenêtres WinForms. Je ne pense pas que ce soit déconseillé.

Je pense que tu ne verra pas beaucoup de différences entre créer des checkbox ou les dessiner toi même. Mais je pense que pour continuer comme tu fais il vaudrait mieux les dessiner toi même.
0
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
10 avril 2010 à 13:14
Ce que je me suis toujours demandé pour WPF, c'est, comment se fait-il que les Winforms ne fonctionnent pas avec si c'est si bien ? Car après avoir pu tester vaguement Flex, c'est vrai que c'est plus facile de créer un composant en imbriquant des balises.

Merci pour ton avis sur les checkBox. En plus, les faire moi même sera bien plus intéressant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
10 avril 2010 à 13:53
Ce que je me suis toujours demandé pour WPF, c'est, comment se fait-il que les Winforms ne fonctionnent pas avec si c'est si bien ?

WPF et Windows Forms sont deux technologies différentes. WPF est arrivé après les Windows Forms et va petit à petit les remplacer.
0
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
10 avril 2010 à 16:34
Ah oui il me semblair bien avoir lu ça.

Bon j'ai un autre problème là avec le vrai TreeView. Comment se fait-il que je n'arrive pas à avoir l'icône "plus/moins" au lieu des flèches
Ca fait une heure que je cherche et je suis comme un gland là. Pourtant il me semble bien l'avoir déjà fait . A la limite, c'est pas le problème d'implémenter ça à ma façon dans le miens, mais je voudrais bien comprendr quand même pour le vrai TreeView !
0
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
11 avril 2010 à 22:44
Purée je suis vraiment une tâche ! Oui je les avais déjà vu ces petits boutons plus et moins ... avant que j'installe un pack de customisation d'XP
J'ai donc remplacé la peinture de ce bouton et aussi la check box avec la classe "ControlPaint" que je ne connaissais pas mais qui est super pratique ! Je peux peindre n'importe quel contrôle facilement sans me retrouver avec 50000 checkBox au cas où j'ai beaucoup de TreeNodes.

J'ai aussi rajouter la gestion de ce CheckBox et je vais rajouter son évènement "CheckedNodeChange" comme je l'ai fait pour "SelectedNodeChange".
C'est la première fois que j'essaye de gérer les évènements tout seul sans double-cliquer bêtement sur un bouton ,mais je ne suis pas bien sûr de faire ça comme il faut.

J'ai donc écrit une classe "cTreeViewEventArgs" qui a pour l'instant comme seule propriété "SelectedNode".

Public Class cTreeViewEventArgs
  Inherits EventArgs

  Private _SelectedNode

  Public Sub New(ByVal SelectedNode As cNode)
    SelectedNode = SelectedNode
  End Sub

  Public Property SelectedNode() As cNode
    Get
      Return _SelectedNode
    End Get
    Set(ByVal value As cNode)
      SelectedNode = value
    End Set
  End Property
End Class


Dans ma classe "cTreeView", je déclare mes Event comme ceci:
Public Event SelectedNodeChanged(ByVal sender As Object, ByVal e As cTreeViewEventArgs)

Public Event HoverNodeChanged(ByVal sender As Object, ByVal e As cTreeViewEventArgs)


Et quand j'en ai besoin dans ma classe TreeView, j'utilise
RaiseEvent SelectedNodeChanged(Me, New cTreeViewEventArgs(_SelectedNode))

...où "_SelectedNode" est une variable privée représentant le noeud sélectionné.

Et dans ma "FormMain", j'ai bien mon évènement dans la liste, et ça a l'air de fonctionner.

Mais est-ce la bonne façon de faire ?

J'ai vu qu'il y avait des solutions avec des "addHandler", et j'avoue ne pas avoir trop compris.
Mais avec la solution que j'ai choisie (qui a l'air d'être celle utilisée dans les contrôles), est-ce qu'il y a quelque chose à supprimer pour ne pas encombrer la mémoire ou je ne sais quoi ?

Voilà voilà pour mes autres interrogations. J'avance petit à petit, et là je vais ajouter toutes mes petites options de personalisation dans les propriétés de ma classe.
0
Rejoignez-nous