cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
13 mai 2009 à 12:42
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
14 mai 2009 à 12:52
Salut à tou(te)s
Je suis confronté au problème suivant :
Depuis mon appli VB6, je dois déterminer si les CheckBox d'une ListBox d'un programme externe sont à True ou False.
La ListBox appartient aux options d'un programme (exe) et je dois mémoriser les réglages actuels avant de les modifier.
Chaque Item est affublé d'une CheckBox.
J'ai récupéré le handle de la ListBox.
Avec SendMessage et les diverses constantes j'ai pu récupérer le nombre d'items et leur texte, mais je n'arrive pas à récupérer l'état Checked ou UnChecked de chaque Item.
Malheureusement, il ne correspond pas à l'état Selected qui ne désigne que l'item qui a actuellement le focus
Une idée ?
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 13 mai 2009 à 15:52
Salut Renfield
J'étais sûr que tu serais le premier à mettre son grain de sel dans ce problème, lol : Welcome !
Oui, inévitablement, je suis tombé sur ta source fort intéressante, mais en effet, le GETSEL ne renvoie pas l'état de la CheckBox
En utilisant WinID, en effet, sur une ListBox de VB (ThunderListBox), en dessous de ExStyle 0x204 apparait un petit 0xD9 ou 0x81 selon que la ListBox a ou n'a pas de CheckBox (je pense qu'il s'agit d'un style non documenté) et le GETSEL renvoie bien l'état de la CheckBox.
Par contre, mon composant est une ListBox (pas Thunder) et le GETSEL ne renvoie rien, tjrs 0
Je continue ma quète ...
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 13 mai 2009 à 17:39
Oui, eh bien tu as bien fait de me faire rechercher des exemples :
Par exemple, dans VB6, quand on affiche la liste des références d'un projet, la liste est une ListBox avec CheckBox.
Eh bien le GETSEL fonctionne parfaitement sur cette ListBox.
La ListBox récalcitrante fait partie d'un logiciel professionnel (DeltaV:Process History View) et son option "Toolbars" affichant une même ListBox avec Checbox ne réagit pas de la même façon et me renvoie toujours 0.
Bizarrerie peut-être lié à la vieille version de cette suite logicielle.
Dans [www.template.fr/MVP/WinId_ListBox.jpg <cette copie d'écran>], j'ai mis en vis-àvis les 2 WinId sur les ListBox.
Perso, je ne remarque rien de particulier ...
Merci de m'avoir fait ouvrir les yeux, je n'avais pas pensé à comparer avec un autre objet, tellement persuadé que tous réagiraient pareil ... snif.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 13 mai 2009 à 17:44
Si, une différence quand même : la listBox des références VB6 est sur un XP FR à jour) alors la ListBox récalcitrante est sous XP en US (bloqué en SP2 pour des raisons de compatibilité du logiciel professionnel), mais à part ça, je ne vois pas de différence.
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 13 mai 2009 à 18:08
Si, encore une différence et celle-là peut-être plus importante :
Côté ListBox qui réagit bien, la classe est issue de User32
Côté ListBox qui déconne, la classe vient de COMCTL32 d'un sous-répertoire de Windows\WinSxS (c'est lié aux différents SP, ce WinSxS ?)
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 14 mai 2009 à 12:24
Encore moi.
Puisque la seule différence entre ces deux ListBox est le style LBS_MULTIPLESEL, et qu'il semble logique de ne pas pouvoir extraire plusieurs états sans cette propriété MultipleSel.
J'ai donc modifié en dynamique le style de la ListBox récalcitrante (avec un SetWindowLong).
Le résultat de la lecture des états des CheckBox par GETSEL est toujours impossible, il ne renvoie que l'item actuellement en bleu-sélecté.
Question : Après avoir modifié un Style, faut-il faire qqchose d'autre, genre Redraw, pour qu'il tienne compte de cette nouvelle propriété ?
J'ai essayé de faire un
RedrawWindow ListBoxWnd, ByVal 0&, ByVal 0&, RDW_INVALIDATE
sans succès.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)