IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Manipulation d'une SysTreeView32


Sujet :

C

  1. #1
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut Manipulation d'une SysTreeView32
    Bonjour,

    Je fais un AddIn pour Visual Studio en C#, avant de me crier dessus parce que ce n'est pas le bon forum, faut lire un peu plus loin
    Même si vous ne connaissez pas Visual Studio vous pouvez quand meme connaitre certaines réponses dès lors que vous êtes familier des TreeView en API WIN32.

    L'API fournie pour manipuler les fenêtres contenant des hiérarchies (typiquement l'explorateur de solution) est plus qu'extrêmement limité. En effet, elle permet de faire 2 choses : ouvrir/fermer un noeud et

    C'est tellement limité que j'ai entreprit de coder une classe qui encapsule la TreeView en me permettant d'envoyer/intercepter les messages. Conclusion, je l'utilise exactement comme en C, avec les mêmes messages, les mêmes fonctions, les mêmes structures, ...

    Seulement je trouve peu de documentation sur son utilisation en C et je me pose donc quelques questions :
    - Les noeuds sont identifiés par des HTREEITEM, qui est définit comme ceci dans commctrl.h
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct _TREEITEM *HTREEITEM;
    Mais je n'ai pas trouvé la définition du _TREEITEM. Je ne sais donc pas comment est la structure en question.

    - Les noeuds sont identifié par des HTREEITEM comme je disais plus haut, mais comment obtenir les données pointées par le noeud ? Typiquement, dans le coté .Net, j'ai des UIHierarchyItem pour représenter un noeud, comment je trouve le HTREEITEM correspondant et inversement ?

    - Je ne trouve aucun mécanisme pour masquer un noeud. J'ai des noeuds que je veux juste rendre invisible. J'ai lut à certains endroits qu'il fallait supprimer purement et simplement les noeuds de la treeview et les ré-insérer quand on voulait les rendre à nouveau visible. Ca m'étonne un peu qu'il n'y ai pas plus simple. Et comment je peux faire ca alors que je n'ai aucune idée de la taille et de la structure qui se cache derrière un HTREEITEM.

  2. #2
    Membre expérimenté Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Par défaut
    Je fais un AddIn pour Visual Studio en C#, avant de me crier dessus parce que ce n'est pas le bon forum, faut lire un peu plus loin
    Même si vous ne connaissez pas Visual Studio vous pouvez quand meme connaitre certaines réponses dès lors que vous êtes familier des TreeView en API WIN32.
    Ce message aurait tout de même un peu plus de réponses sur le forum win32.

    Je programme un peu avec l'API Win32, et ce que je sais des HTREEITEM, c'est que ce sont des handles vers une structure non accessible directement, mais que l'on peut modifier grâce à un set de fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    typedef struct tagTVITEM {
        UINT mask;
        HTREEITEM hItem;
        UINT state;
        UINT stateMask;
        LPTSTR pszText;
        int cchTextMax;
        int iImage;
        int iSelectedImage;
        int cChildren;
        LPARAM lParam;
    } TVITEM, *LPTVITEM;
     
    BOOL TreeView_GetItem(HWND hwndTV,LPTVITEM pitem);
    BOOL TreeView_SetItem(HWND hwndTV,LPTVITEM pitem);
    ... (pour plus d'infos, voir la msdn)
    Tout ce qui est necessaire, c'est d'avoir le handle win32 du treeview. Il existe forcément un moyen pour y acceder en .NET. Mais je ne programme pas en C#.

  3. #3
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Bonjour,
    J'ai déjà créé le set de structure et de p/invoke pour le TVITEM et les fonctions que tu cites. Mais ca ne donne accès à rien.
    Ca donne accès à un état pour le noeud, son l'index de son icone de sélection/status et le texte du noeud.
    Mais je n'ai rien d'autre comme infos. Ce qui fait que je ne peux pas supprimer un noeud de la treeview car je serais incapable de l'y remettre. Ne connaissant pas la taille de l'objet pointé par le htreeitem, et encore moins sa structure, je ne peux pas sauvegarder l'objet, même binairement, pour l'y remettre plus tard.

    Pour être un peu plus clair, si je prend l'exemple de l'explorateur de solution.
    La treeview est exposé aux addin par une instance d'un objet COM qui implémente l'interface UIHierarchy. Cet interface possède 2 ou 3 méthodes, par exemple pour obtenir la liste des noeuds sélectionnés.
    Chaque noeud est exposé aux addin par des instances d'objets COM qui implémentent l'interface UIHierarchyItem. Les méthodes permettent d'obtenir le nom du noeud, de l'ouvrir/fermer, de changer son état de sélection, et dans certains cas, d'obtenir un objet qui représente un projet ou un fichier source.

    Le premier problème est que lorsqu'un projet est déchargé (clic-droit->décharger le projet) son contenu n'est plus affiché, a la place le noeud du projet devient gris et ne possède plus qu'un enfant.
    Sauf qu'avec les UIHierarchyItem, on a pas de moyen de savoir que le noeud est un projet déchargé, et encore moins de savoir de quel projet il s'agit (en faisant de grosses bidouilles j'arrive a obtenir l'instance de l'objet qui représente le projet, mais l'accès aux propriétés qui retournent le nom de fichier (csproj, vbproj, ...) provoque une exception).

    Bref, ce point la je me débrouille en provoquant la lancée d'exception et en parsant parallèlement le fichier .sln (comme c'est efficace ...)

    On est donc en droit de se dire que le htreeitem est un objet qui implémente l'interface UIHierarchyItem, j'ai donc tenté de regarder la mémoire afin de découvrir la taille et peut être une partie de la structure de l'objet en question.
    J'ai découvert que l'objet en question commence par 2 pointeurs, l'adresse du htreeitem parent, et l'adresse du prochain htreeitem de même niveau.
    Par contre, pour la suite, je n'ai rien découvert de très cohérent. De plus, je n'ai trouvé aucune adresse semblable a celle du UIHierarchyItem.

    J'en suis venu à me demandé si les UIHierarchyItem ne seraient pas stockés dans un banal vecteur et que le htreeitem transporte l'index de cet item.

    Si au moins je trouvais un moyen de déterminer la taille du htreeitem je pourrai orienter un peu plus mes recherches. Mais la, ca dépasse mes faibles compétences de reverses engineering :'(

    Enfin bon, dans l'immédiat, j'ai résolut la problématique de départ qui consistait a masquer les projets déchargés (dans note boite on a des solutions qui ont plus de 160 projets, mais on charge qu'une dizaine simultanément, et donc on voulait masquer les autres afin de réduire l'arbre).
    La solution est dégueu a souhait, et provoque des petits problèmes lorsqu'on doit ensuite commiter le code sur le dépôt, mais ca fonctionne ...

Discussions similaires

  1. Réponses: 14
    Dernier message: 20/09/2006, 21h07
  2. Conseil sur la manipulation d'une string?
    Par Jayceblaster dans le forum Delphi
    Réponses: 6
    Dernier message: 13/07/2006, 14h29
  3. [VB6]Accès et manipulation d'une BD Access sur réseau
    Par moi_leila dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/04/2006, 18h48
  4. manipulation d'une liste chainé
    Par sorari dans le forum C++
    Réponses: 1
    Dernier message: 16/03/2005, 12h32
  5. [XSLT] Manipulation d'une String
    Par Eskarina43 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/06/2004, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo