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.
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);
où 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:
- Comment calculer les unités de boîte de dialogue en fonction de la police actuelle dans Visual C++
- Comment calculer les unités de base d'une boîte de dialogue avec une police non basée sur le système
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()