2017-10-20 27 views
2

Ma question concerne les zones de liste déroulante dans les applications Windows MFC.Zone de liste déroulante dans une application MFC

La partie déroulante de la zone de liste déroulante contient des éléments composés d'un bitmap et d'une chaîne.

Parfois, les chaînes sont trop longues et je dois ajuster la largeur de la partie déroulante de la liste déroulante en utilisant la méthode CComboBox::SetDroppedWidth().

Mon problème est que lorsque la zone de liste déroulante est proche du bord droit de l'écran de l'ordinateur, la partie droite de la liste déroulante est masquée (voir image_1 et image_2 ci-dessous). Je voudrais qu'il se comporte comme dans Excel (voir image_3 ci-dessous) ce qui signifie que je voudrais que la liste déroulante soit décalée en conséquence afin que tous ses éléments puissent être vus sans être recadrés.

Comment cela peut-il être réalisé?

image_1: partie droite de la liste déroulante n'est pas caché right part of the dropdown is NOT hidden

image_2: près de l'ordinateur bord droit, la partie droite de la liste déroulante est caché right part of the dropdown is hidden

image_3: Zone de liste déroulante Excel Excel combo box

=========================================== ======================

EDIT 1 handles are null

================ =====================================================

EDIT 2

Ok. J'ai oublié de mentionner que m_cbXmodels est un objet CComboBoxEx. C'est pourquoi les poignées sont NULL. Je pouvais obtenir les poignées via GetComboBoxCtrl() ...

+3

Copie possible de [Forcer une liste déroulante à "dropdown" ci-dessus au lieu de ci-dessous] (https://stackoverflow.com/questions/36307412/forcing-a-combobox-to-dropdown-above-instead-of-below) –

Répondre

3

Gérer la notification CBN_DROPDOWN.

Obtenez le handle pour le contrôle de liste avec GetComboBoxInfo.

Utilisez maintenant MoveWindow pour ajuster la fenêtre si nécessaire.

L'obtention de la taille d'écran actuelle est disponible avec MonitorFromWindow. Voir rcWork membre dans MONITORINFO. Vous avez juste besoin d'ajuster les coordonnées gauche et droite. Comme vous pouvez le lire dans les commentaires: Mon approche avec CBN_DROPDOWN est au début Merci à zett42). Il n'est pas possible de redimensionner la partie de la liste déroulante ici.
Mais il est possible d'envoyer un message défini par l'utilisateur à la même fenêtre et de repositionner la fenêtre que.

+0

Merci. Lorsque j'appelle GetComboBoxInfo(), je remarque que le handle pour le contrôle de liste est NULL (hwndCombo, hwndItem et hwndList sont NULL). –

+0

Vous devez prédéfinir le membre cbSize! – xMRi

+0

Nouveau problème: la liste déroulante ne bouge pas. Le code est: HWND hwndList = info.hwndList; :: MoveWindow (hwndList, 40, 40, 100, 100, 1); –