Question

Comment créer un contrôle bouton (avec CreateWindow d'un BUTTON classe de fenêtre) qui a une taille standard à l'échelle du système (en particulier la hauteur) qui est cohérente avec le reste des applications Windows ?Je devrais bien sûr prendre en compte le DPI et probablement d'autres paramètres.

Remarque: En utilisant USE_CW_DEFAULT pour la largeur et la hauteur, cela donne un bouton de taille 0, 0, ce n'est donc pas une solution.

Était-ce utile?

La solution 2

Dans un monde parfait et sans tracas...

Pour créer un bouton de taille standard, nous devrions procéder comme suit :

LONG units = GetDialogBaseUnits();
m_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Close"), 
                 WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
                 0, 0, MulDiv(LOWORD(units), 50, 4), MulDiv(HIWORD(units), 14, 8),
                 hwnd, NULL, hInst, NULL);

50 et 14 sont des dimensions DLU respectives, 4 et 8 sont respectivement des unités de modèle de dialogue horizontales et verticales, basées sur GetDialogBaseUnits() fonction remarques documentaires.


Rien n'est parfait

MAIS comme Anders l'a souligné, ces mesures sont basées sur la police système.Si votre fenêtre utilise une police de dialogue shell ou simplement quelque chose qui ne vous fait pas saigner les yeux, vous êtes pratiquement seul.

Pour obtenir vos propres unités de base « dialogue », vous devez récupérer les métriques de texte actuelles avec GetTextMetrics() et utilisez la hauteur des caractères et la largeur moyenne (tmHeight et tmAveCharWidth de la TEXTMETRIC struct respectivement) et traduisez-les vous-même avec MulDiv, sauf si vous êtes dans un dialogue, alors MapDialogRect() fera tout le travail pour vous.

Noter que tmAveCharWidth ne fait qu'approcher la largeur moyenne réelle des caractères, il est donc recommandé d'utiliser un GetTextExtentPoint32() fonctionner sur un jeu de caractères alphabétiques à la place.

Voir:


Alternative plus simple

Si les boutons sont le seul contrôle que vous souhaitez redimensionner automatiquement, vous pouvez également utiliser BCM_GETIDEALSIZE message Button_GetIdealSize() macro (Windows XP et versions ultérieures uniquement) pour récupérer la largeur et la hauteur optimales qui correspondent à tout ce que contient le bouton, même si cela semble plutôt moche sans aucune marge appliquée autour du texte du bouton.

Autres conseils

Voici ce que MSDN a à dire : Spécifications et directives de conception - Conception visuelle :Mise en page.

La taille par défaut d'un bouton est de 50 x 14 DLU, qui peuvent être calculées en pixels à l'aide des exemples présentés pour ObtenirDialogBaseUnits.

Le MapDialogRect la fonction semble faire le calcul pour vous.

@macbirdie :vous ne devez PAS utiliser GetDialogBaseUnits(), elle est basée sur la police système par défaut (police bitmap Ugly).Vous devriez utiliser MapDialogRect()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top