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

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

patricktoulon

XLDnaute Barbatruc
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 🤣
 

patricktoulon

XLDnaute Barbatruc
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

  • combobox dropdown or not dropdown handle child return .xlsm
    31.5 KB · Affichages: 2
Dernière édition:

Dudu2

XLDnaute Barbatruc
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

  • GetControlHandleMethods.xlsm
    78.5 KB · Affichages: 4

Dudu2

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

1668015027514.png
 

patricktoulon

XLDnaute Barbatruc
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:

Dudu2

XLDnaute Barbatruc
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 !
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Ok, c'est vrai tu l'as solutionné.
Et de mon coté j'ai solutionné le problème de la ComboBox ActiveX.
Donc cette fois tout est bon dans le cochon du WindowFromPoint qui permet d'obtenir TOUS LES HANDLES / RECTs, au moins en 64Bits, je n'ai pas vérifié sur 32Bits.
 

Pièces jointes

  • GetControlHandleMethods.xlsm
    83.6 KB · Affichages: 0

Dudu2

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
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

  • GetControlHandleWithWindowFromPöint.xlsm
    64.7 KB · Affichages: 0

Dudu2

XLDnaute Barbatruc
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.
 

Statistiques des forums

Discussions
312 506
Messages
2 089 121
Membres
104 038
dernier inscrit
Helpme59