2009-08-21 5 views
5

En Delphi, tous les contrôles TEdit et TComboBox ont une hauteur de 21 pixels par défaut. Dans le cas de TComboBox, cette taille est absolue et essayer de l'étirer à quelque chose de plus gros ne fonctionne pas. Dans le cas de TComboBoxEx cependant, la hauteur par défaut est de 22 pixels, ce qui le fait ressortir un peu sur n'importe quelle forme où vous l'utilisez. Maintenant, selon le Microsoft docs, ComboBoxEx est essentiellement un ComboBox avec la fonctionnalité dessinée par le propriétaire étant gérée pour permettre les images et l'indentation.Puis-je avoir TComboBoxEx à la même hauteur que TComboBox?

Alors est-il possible de rendre mes contrôles TComboBoxEx de 21 pixels de haut? De quoi cela dépend-il?

Mise à jour: J'ai ajouté un Quality Central report sur le problème, comme suggéré par Roddy. Aussi, j'ai trouvé une solution. Apparemment, la taille dépend de la taille de l'item -1 dans la combobox. Donc, vous définissez cette taille à 15 (ou un pixel de moins que la taille par défaut) et la boîte se rétrécit aux 21 pixels les plus familiers.

+0

Wow - fix propre! Je vous suggère de l'ajouter comme «réponse acceptée» à votre propre question. Ça vaut vraiment le coup! – Roddy

+0

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. –

Répondre

6

J'ai trouvé un correctif. Delphi semble avoir quelques bugs liés à ceci:

  1. 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.
  2. 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); 
+0

Un TEdit sur mon ordinateur portable avec un paramètre DPI de 124 n'est certainement pas de 21 pixels de haut. Les hauteurs codées en dur sont tout simplement fausses, qu'elles fonctionnent pour vous ou non, et le retour de 15 n'est pas vraiment mieux que le retour 16. Qu'en est-il des différentes polices ou paramètres DPI? Une vraie solution impliquerait d'obtenir la hauteur de la police et de calculer la hauteur de l'objet en fonction de cela. – mghie

+0

-1 pour les constantes codées en dur comme mghie expliqué –

+0

Point pris sur le réglage DPI. Alors maintenant j'ai besoin de savoir comment la hauteur d'une boîte d'édition est calculée. J'ai regardé calculer la hauteur de l'objet en fonction de la hauteur de police, mais je ne vois pas comment cela les a amenés à 16 en premier lieu - je pense en fait qu'il a été choisi pour 16x16 glyphes. Ce qui semble fonctionner à la fois sur 96 DPI et sur 120, c'est d'appeler GetTextMetric et d'utiliser le tmHeight + 2. Je pensais que l'utilisation de tmHeight + tmInternalLeading serait correcte, mais cela ne fonctionne qu'à 120 DPI. Je pourrais commencer à 15 heures et passer de 96 à 120, mais cela ne semble pas non plus bien. Des idées? –

1

La hauteur d'un TComboBox n'est pas absolue; c'est lié à la hauteur de la police que vous utilisez. TComboBoxEx fonctionne de la même manière, mais il semble qu'il y ait un pixel supplémentaire de "surcharge", comme vous l'avez noté, et il ne semble pas y avoir de moyen simple de changer cela. S'il s'agit d'un wrapper pour un contrôle Windows intégré, il peut ne pas être possible de le modifier au niveau Delphi, point.

+0

Sauf si vous voulez créer votre propre version, mais je ne pense pas que ce soit une option valide ;-). –

1

Deux façons de changer la hauteur de TComboBoxEx, malheureusement, ne sont probablement pas ce que vous voulez.

  • Affectez à la propriété font.size une taille plus petite - la boîte se rétrécira. (cependant, votre texte est plus petit)

  • Définissez StyleEx.csExNoSizeLimit: = false, puis définissez Height: = 21 comme vous le souhaitez. Malheureusement, cela provoque simplement l'écrêtage de votre boîte, de sorte que la lunette inférieure disparaît.

Je probablement remplacer tous les TComboBoxes avec TComboBoxEx - GExperts a un brillant "remplacer les composants de l'assistant pour ce faire.

Cela ressemble à un bug Delphi. L'avez-vous signalé via QC?

+0

Ajout du rapport de contrôle de la qualité. Lien ajouté à la question. –

Questions connexes