ListBox avec CheckBox et SendMessage

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 13 mai 2009 à 12:42
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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)

12 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 14:02
faisant le test en utilisant une appli VB...

List1.AddItem "Mercure"
List1.AddItem "Venus"
List1.AddItem "Terre"
List1.AddItem "Mars"
List1.AddItem "Jupiter"
List1.AddItem "Saturne"
List1.AddItem "Uranus"
List1.AddItem "Neptune"

List1.Selected(2) = True '# Coche Terre
List1.Selected(4) = True '# et Jupiter

List1.ListIndex = 6 '# surligne Uranus (ne coche pas la case)


Il nous faut donc trouver un moyen de récuperer cela...

je m'y colle
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 14:16
j'ai ajouté a coté un autre listbox et j'ai comparé leur STYLE (GetWindowLong et GWL_STYLE)

j'en déduit que la combinaison de flags correspondant au checkboxes est &hD9

voir:
http://www.vbfrance.com/codes/EXTRAIRE-TEXTE-FENETRES-APPLICATIONS-TIERCES-LISTBOX-LISTVIEW-TEXTBOXES_46390.aspx

a voir après en testant avec une appli non-VB

mais je sais pas trop quoi utiliser, qui affiche des listbox avec des checkbox, donc...
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 15:58
quel appli est ciblée ?

j'ai pas d'exemple sous la main pour t'aider...

un composant MFC ?

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 mai 2009 à 17:47
<Lien de la capture> (oublié le http:)
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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és 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mai 2009 à 12:30
non... rien de particulier a faire.

a voir si la gestion des checkbox n'est pas effectuée par un subclassing.

mais tu sembles être le seul a tester :(
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 mai 2009 à 12:50
Ok, merci
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mai 2009 à 12:52
* à pouvoir tester
Rejoignez-nous