API sur TreeView - Problème de TVM_GETITEMRECT

Signaler
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tous

Je patauge sur un problème suivant :
J'ai un programme externe affichant des données dans un TreeView (SysTreeView32).
Mon application VB veut pouvoir récupérer le rectangle graphique d'un des Items de ce TreeView afin de lancer un Drag-Drop.
Je récupère le handle du TreeView.
J'énumère les items et je récupère le texte de ces Items (Merci Renfield)
J'ai le handle de l'Item qui m'intéresse.
J'arrive à lui envoyer des commandes SendMessage comme ENSURE_VISIBLE qui fonctionne correctement, donc je suis sûr que le handle que de l'Item est le bon.

Mais dès que je veux récupérer le RECT de cet Item, cela fait planter le programme externe - conséquence classique de la mauvaise utilisation des APIs.

Voilà mon code :
Private Function GetTreeViewNodeRect(ByVal hTV As Long, _
                                     ByVal hItem As Long, _
                                     Optional IncludeTextOnly As Boolean) As RECT
    Dim lpRect          As RECT
    Dim lIncludeText    As Long
    
    lpRect.Left = hItem
    lIncludeText = CLng(IncludeTextOnly)
    If SendMessage(hTV, TVM_GETITEMRECT, ByVal lIncludeText, lpRect) Then
        GetTreeViewNodeRect = lpRect
    End If
End Function
avec
Private Const TV_FIRST                  As Long = &H1100
Private Const TVM_GETITEMRECT           As Long = (TV_FIRST + 4)
Ma déclaration de SendMessage est classique :
Private Declare Function SendMessage Lib "user32" _
    Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                     ByVal wParam As Any, lParam As Any) As Long

J'ai eu beau essayer plusieurs syntaxes autour de lpRect, rien n'y fait (VarPtr, ByVal ...)
Pourtant, sur le net, ce code apparait souvent et personne ne semble s'en plaindre.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour, jack,
Comment et où as-tu déclaré la structure RECT (je ne la vois pas) ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Je ne sais pas non plus d'où(évènement) et à quel moment tu appelles ta fonction.
Je t'ai, en attendant, trouvé sur le net une discussion (in Shakespeare's language, sorry), qui devrait t'intéresser.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et zut ! La voilà donc :
Tapez le texte de l'url ici.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut uc (tu permets que je t'appelle uc)

Ma structure : je n'ai pas réinventé la poudre :
Private Type RECT
    Left            As Long
    Top             As Long
    Right           As Long
    Bottom          As Long
End Type
Quant au lien, je l'ai rencontré aussi, parmi les centaines que j'ai éclusé, même en japonais !
En fait, le problème dont ils parlent tous est de retrouver les coordonnées écran à partir de ce RECT car les coordonnées récupérées sont relatives au TreeView et pas à l'écran.
Tous utilisent cette même méthode qui ne veut rien savoir chez moi.

Depuis ce matin que je galère sur cette ligne, grrr.
Première fois que je perds autant de temps sur une broutille.
J'envisage des plans 'B' comme "récupérer l'item le plus en haut, compter les items visibles qui suivent jusqu'à celui que je vise et calculer une approximation de x/y par rapport au bord du TV * la hauteur standard d'un Item" - rien de bien glorieux

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Ton plan B me parait bon, mais n'y va pas par "approximation", mais à la régulière.
TextHeight devrait t'y aider
Pense également aux bordures (systemmetrics)
Tout serait par ailleurs plus facile(moins complexe) en passant tout (form inclus) en échelle de pixels, probablement, puisque la position du Form par rapport à l'écran est en pixels.
Bon courage, mais je ne vois pas non plus autre chose de valable que ton plan B


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et quid, puisque tu as le rect par rapport à la TV, de l'utilisation de la fonction ClientToScreen ?
Tente, mais ainsi : paramètre hwnd = hwnd de la TV, mais positions : celles du RECT
Essaye.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Hélas, le TreeView n'est pas dans une forme VB de mon appli, donc tous ces paramètres doivent être récupéré via les APIs. J'espère ne pas autant galérer avec ceux-là !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Peu importe, puisque tu as le hwnd de la TV, selon ce que tu as dit plus haut :
Je récupère le handle du TreeView

ClientToScreen transpose à la seule aide de ce hwnd et de la coordonnée à transposer.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Ah Ok, j'avais pas compris comme ça.

Oui, plus facile : les API de récup du Height et NextVisible fonctionnent sans souci.
Mais bon, j'aimerai bien comprendre pourquoi ce message ne passe pas ... un jour peut-être.