XL 2016 Quelle API pour savoir si une ListBox (UserForm ou ActiveX) a sa ScrollBar Verticale présente ?

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour les XLDNautes,

Si on peut, sans API, savoir si une ComboBox a son ascenseur affiché grâce à la différence (ComboBox.ListCount - ComboBox.ListRows) ce n'est pas possible avec les ListBoxes.
Certes on connaît son ListBox.TopIndex mais il n'existe pas de ListBox.BottomIndex.
Un approximation est possible avec la ListBox.Font.Size mais ça reste imprécis.

Reste l'API qui pourrait indiquer la présence d'une Vertical ScrollBar mais mes essais sont restés infructueux.
Merci pour toute suggestion.
 
Solution
pour ce qui est de cette discussion j'ai revue la chose pour les ListBox dans userform et feuille
En fait c'est encore plus simple.
Pour connaître la fenêtre d'une ComboBox ActiveX, il faut d'abord l'activer.
Inutile de faire ce que j'ai fait avant avec des comparaisons de RECT et RECT parent.

Je suppose que c'est la même chose avec la ComboBox UserForm, et là il faut probablement (à vérifier) un SetFocus "nouveau" comme dans la fonction du Post #13.
non le setfocus et getfocus sur combo dans le userform me donne l'userform
c'est bien là le problème


dans mon fichier 4 dans l'autre discussion
je teste le point x , y+ le heightcombo en pixel
si pareil que userform (ou le parent frame ou autres )alors pas déployé
si pas pareil alors c'est la child
donc le getparent donne la "F3 MdcPopup 6xxxx..."le vrai rectangle combo
et la child c'est la "F3 server 6xxxxxxxxx " même classe que les frame listbox

en testant le classname on prend directement un raccourci plutot que de shopper le handle parent avant pour la comparaison

le problème avec cette méthode raccourci c'est que si la combo est fille d'un frame ou multipage ben c'est mort

il faut donc connaître le handle parent d'abords

grâce a dieu j'ai trouver le moyen de chopper mes rectangles sans api 🤣
 
ca y est j'ai adapté mon fichier 4
avec le windowfrompoint pour win64
tu peux vérifier si ces bon EN 64 ?
dans l'event de la combo tu a le choix d’appeler une ou l'autre fonction
  1. la fonction GetComboboxDropdownState
  2. la fonction GetComboboxChildRectangle
débloque l'une ou l'autre selon ton souhait DANS L EVENT MOVE
 

Pièces jointes

Dernière édition:
Pour le ComboBoxes en UserForm c'est assez difficile de trouver leur Handle & RECT.

En effet il faut déjà savoir à quel niveau de "profondeur" se trouve la ComboBox.
C'est à dire combien de structures d'imbrication (Frames, Multipages) elle possède avant d'arriver au UserForm.

Ensuite il faut remonter les fenêtre Parentes (GetParent) en fonction de cette "profondeur".
Puis comparer le RECT du dernier Parent au RECT du Client du UserForm et en tirer les conclusions.

Alors ça marche chez moi en 64Bits. Ça devrait fonctionner en 32Bits mais va savoir... !
 

Pièces jointes

Ton fichier... Je te laisse corriger pour ne pas embrouiller le truc.
1668015058549.png

1668015027514.png
 
j'ai compris ton principe de 1,2,3 profondeur
mais si tu regarde ce que j'ai fait c'est pas utile

  1. on le sais le handle de la combo on l'aura pas directement dessus
  2. on fait un rangefrompoint windowfrompoint avec le pos.y +la combo *pixel si le y de l'event < que le height
  3. on shoppe le supposé handle de la child (je dis bien supposé)
  4. que cela te tienne on teste la classe du parent
  5. si f3 mdc popup alors on a bien la child développée sinon non
  6. donc si oui rectangle sinon pas rectangle
l'avantage c'est que l'on peut le savoir des l'entrée dans le combo

edit : pardon c'est windowfrompoint et non rangefrompoint
 
Dernière édition:
Ok je comprends ce que tu fais, mais il y a la possibilité qu'on a déjà évoquée dans l'autre sujet, qu'un autre Control se trouve en "pos.y + la combo *pixel" si le curseur (pos.y) est en bas de la liste et que ce Control jouxte le bas de la liste. Je sais bien que la probabilité est faible mais elle est non nulle.

Ce qui maintenant me pose problème, c'est qu'on récupère (quelque soit la méthode):
- un beau RECT de la DropDown zone d'une ComboBox UserForm,
- un RECT de la ComboBox zone d'une ComboBox ActiveX.
Donc pas de cohérence.

Le challenge est maintenant de trouver un beau RECT de la DropDown zone d'une ComboBox ActiveX.
C'est jamais fini ce truc !
 
Je vais peut-être revoir le Scroll pour faire une version qui utilise cette méthode plutôt que les calculs et estimations sur la base des positions relatives des Controls qui pourtant a l'air de bien fonctionner ce qui me fait hésiter.
 
Voilà le fichier débarrassé des autres méthodes avec seulement la méthode WindowFromPoint qui est la seule qui soit généraliste et relativement simple. J'ai gardé ma méthode "profondeur" pour les ComboBoxes UserForm mais tu peux te faire plaisir et la remplacer par la tienne. Pareil pour le Pane de l'Objet.
 

Pièces jointes

re
Bonjour @Dudu2
ok comme tu veux mais sache que cette astuce est utilisée on the world

Et de mon coté j'ai solutionné le problème de la ComboBox ActiveX.

une question c'est quoi activX pour toi ?
parce que j'ai du mal cerner ta définition

les activX se sont des controls tel que tu vois dans un userforms ou une feuille se sont les mêmes en fait
sauf erreur de ma part


😉
 
Je sais pas trop la définition.
Quand c'est la feuille qui est Parent j'ai considéré Control ActiveX pour les différencier des Controls de Formulaire. Et Control de UserForm quand c'est le UserForm qui est Parent.
Il est possible que les 2 soient ActiveX, je ne me suis jamais posé la question.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour