cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
9 oct. 2012 à 15:29
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
9 oct. 2012 à 20:15
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)
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 9 oct. 2012 à 17:47
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 9 oct. 2012 à 17:55
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
________________________
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 oct. 2012 à 18:17
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 9 oct. 2012 à 18:24
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 9 oct. 2012 à 18:34
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 oct. 2012 à 18:41
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à !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 9 oct. 2012 à 18:44
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 oct. 2012 à 20:15
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.