ListBox avec CheckBox et SendMessage

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
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
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

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
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)
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
quel appli est ciblée ?

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

un composant MFC ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
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)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
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.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
<Lien de la capture> (oublié le http:)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
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)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
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)
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
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 :(
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Ok, merci
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
* à pouvoir tester