J'ai trouvé un correctif. Delphi semble avoir quelques bugs liés à ceci:
- La valeur de la propriété ItemHeight publiée est forcé d'être 16, parce que la classe TComboBoxEx remplace la fonction GetItemHt être un 16. codé en dur aucun égard pour la taille réelle de l'article - étrange, car cela fonctionne parfaitement sur TComboBox. Je ne sais pas pourquoi ils ont décidé d'aller avec cette stratégie. Probablement pour s'assurer que les images seront toujours en forme.
- Delphi n'appelle pas réellement le message CB_SETITEMHEIGHT, donc même si vous remplacez cette fonction, rien ne change.
Mise à jour:
Comme l'a souligné mghie, mon idée initiale d'utiliser une valeur codée en dur de 15 pour appeler le message ne fonctionne pas bien à différents réglages de DPI. Donc j'utilise maintenant un calll pour GetTextMetrics pour déterminer la hauteur. La valeur de GetSystemMetrics (SM_CYBORDER) est ajoutée à la hauteur de la police.
Ceci est basé sur la façon dont la VCL détermine la taille d'un TEdit.Je ne pense pas que ce soit tout à fait correct, mais puisque le but est d'avoir le ComboBoxEx de la même taille que TEdit, il est probablement aussi proche que nous le ferons. Et cela fonctionne aux paramètres DPI de 96, 120, 144 et 192.
La hauteur du ComboBoxEx est déterminée par la hauteur de l'élément -1. Donc, les éléments 0 à compter-1 sont les éléments de liste réels, mais l'élément -1 est la hauteur utilisée pour l'éditeur. Si vous définissez cette hauteur à 15, la hauteur du contrôle est corrigée à 21 pixels (voir la mise à jour ci-dessus pour les problèmes de mise à l'échelle). Je pense que Mason peut-être raison que la taille de la police joue un rôle ici (probablement redimensionne l'article), mais vous pouvez le faire fonctionner très bien en ajustant la taille de l'élément. Il semble introduire un nouveau problème (à mon avis, plus petit) en ce sens qu'à 96 DPI, les images hautes de 16 pixels perdent la ligne la plus basse quand elles sont affichées dans la partie éditeur, mais cela est à peine perceptible.
Ainsi, la solution est donc d'appeler ce code:
GetTextMetrics(Canvas.Handle, TM);
SendMessage(Handle, CB_SETITEMHEIGHT, -1,
GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight);
Wow - fix propre! Je vous suggère de l'ajouter comme «réponse acceptée» à votre propre question. Ça vaut vraiment le coup! – Roddy
Ajout de la réponse, mais je ne peux l'accepter que dans un jour ou deux. Il y a aussi une mise en garde qui implique l'affichage de l'image - voir ma réponse ci-dessous. –