Page 1 sur 1
[R] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : ven. 17 mai 2013 11:36
par Jerem
Bonjour,
Au cours du développement d'une GUI je rencontre un petit problème de superposition avec la liste d'une combobox avec l'attribut $CBS_SIMPLE et je ne sais même pas s'il existe une solution à mon souci d'affichage.
Je vous invite à tester le code suivant pour comprendre :
► Afficher le texte
Code : Tout sélectionner
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
GUICreate("GUI affiche ListBox", 220, 110)
$combo = GUICtrlCreateCombo("", 10, 10, 100, 28, BitOR($WS_VSCROLL, $CBS_SIMPLE))
$boutonAjout = GUICtrlCreateButton ("Ajouter item", 120, 10, 80, 20)
$boutonRetirer = GUICtrlCreateButton ("Retirer item", 120, 40, 80, 20)
$label = GUICtrlCreateLabel ("Label", 10, 50, 100, 12)
$input = GUICtrlCreateInput ("", 10, 70, 120, 20)
GUISetState()
$i = 0
Main ()
Func Main ()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $boutonAjout
$i = $i + 1
_GUICtrlComboBox_AddString ($combo, "item " & $i)
Ajuste ()
Case $boutonRetirer
If $i > 0 Then
$i = $i - 1
_GUICtrlComboBox_DeleteString ($combo, $i)
Ajuste ()
EndIf
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndFunc
Func Ajuste ()
$height = 28+$i*13
If $height < 92 Then
GUICtrlSetPos ($combo, 10, 10, 100, $height)
Else
GUICtrlSetPos ($combo, 10, 10, 100, 92)
EndIf
EndFunc
Bien-sûr ceci n'est qu'une illustration très simple du problème.
Ma gui contient plusieurs combo avec des listes dynamiques qui doivent s'afficher dès qu'elles ont le focus.
J'ai essayé d'autres solutions mais qui n'arrivaient pas à ce que je souhaitais. Maintenant mon seul problème est l'affichage.
Re: [..] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : sam. 18 mai 2013 06:48
par jguinch
Salut.
La superposition des contrôles engendre souvent ce genre d'effet.
En général, il suffit de désactiver le contrôle du "dessous" mais je ne pense pas que ce soit ce que tu veux.
Sinon, tu pourrais essayer de mettre tes combos dans des fenêtres enfants transparentes, mais après la gestion sera plus difficile...
Re: [..] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : sam. 18 mai 2013 23:45
par mikell
Faut dire aussi que le style $CBS_SIMPLE est assez restrictif...
Re: [..] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : lun. 20 mai 2013 09:22
par Jerem
@jguinchard : Effectivement, j'avais pensé à désactiver les contrôles sous la combobox, mais au delà du fait que cela pose des problèmes d'utilisation (obligé de quitter la liste pour un élément qui ne se trouve pas sous la liste pour pouvoir ensuite retourner sur un élément sous la liste (suis-je clair là ??)), les éléments désactivés se superposent toujours à la liste.
Le seul moyen est de les cacher mais alors là on rentre dans un autre monde.
La réponse de Mikell me conforte dans l'idée qu'il n'y a pas de solution simple à mon problème.
L'idée de mettre les combos dans des fenêtres séparées n'est pas mauvaise, mais cela me demanderait de revoir tout mon code.
Une solution "simple" consiste à prévoir un espace vierge de tout élément mais ça prend de la place pour rien.
Re: [..] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : mer. 22 mai 2013 12:52
par TommyDDR
Une autre solution simple consiste à créer le combo en dernier.
placez la ligne
Code : Tout sélectionner
$combo = GUICtrlCreateCombo("", 10, 10, 100, 28, BitOR($WS_VSCROLL, $CBS_SIMPLE))
Juste avant la ligne
Re: [..] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : ven. 24 mai 2013 12:38
par Jerem
Sur mon PC ça passe avec les labels, mais pas avec l'input.
Il faudrait peut-être empêcher l'activation des contrôles dynamiques au passage de la souris.
Je regarderai ça.
Merci.
Re: [R] Combo avec liste dynamique et affichage $CBS_SIMPLE
Posté : ven. 24 mai 2013 15:49
par Jerem
mikell a écrit :Faut dire aussi que le style $CBS_SIMPLE est assez restrictif...
J'ai peut-être trouvé une solution grâce à ce message :
http://www.autoitscript.fr/forum/viewto ... 331#p65331
Il y a une piste intéressante à creuser.
EDIT : Mon vrai programme comportait déjà un GUIRegisterMsg, j'ai ajouté un GuiCtrlSetStat ($control, $GUI_ONTOP) dans la catégorie $CBN_SETFOCUS et ça fonctionne.
Pour "réafficher" les autres contrôles, je réduis la taille de la combobox lorsque celle-ci perd le focus ou que le choix est validé par la touche entrée et le tour est joué.
Merci pour cette aide indirecte Mikell
Je passe le sujet en résolu.