Frage
Wie kann ich ein Button-Steuerelement erstellen (mit CreateWindow
einer BUTTON
Fensterklasse), die ein systemweites Standardgröße hat (insbesondere Höhe), das ist im Einklang mit dem Rest der Windows-Anwendungen?
Ich soll DPI natürlich berücksichtigen und wahrscheinlich andere Einstellungen.
. Hinweis: Mit
USE_CW_DEFAULT
für Breite und Höhe ergibt eine 0, 0 Größe Taste, so dass keine Lösung ist
Lösung 2
In der perfekten, stressfreien Welt ...
So erstellen Sie eine Standardgröße Schaltfläche würden wir dies tun müssen:
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);
, wobei 50 und 14 sind jeweilige DLU Abmessungen 4 und 8 sind horizontale und vertikale Dialogvorlage Einheiten jeweils bezogen auf GetDialogBaseUnits()
Funktion Dokumentation Bemerkungen.
Nichts ist perfekt
ABER als Anders wies darauf hin, werden diese Metriken basierend auf der Systemschriftart. Wenn Ihr Fenster ein Shell-Dialog Schriftart oder einfach nichts machen Ihre Augen bluten verwendet, bist du ziemlich viel auf eigene Faust.
Um Ihre eigenen „Dialog“ Basiseinheiten zu erhalten, müssen Sie mit GetTextMetrics()
und Verwendung Zeichenhöhe und durchschnittlicher Breite (tmHeight
und tmAveCharWidth
der TEXTMETRIC
Struktur beziehungsweise) und übersetzen sie mit MulDiv von ihrem eigenen, es sei denn, Sie in einem Dialog, so wird MapDialogRect()
alle die Arbeit für Sie tun.
Beachten Sie, dass tmAveCharWidth
nur die tatsächliche durchschnittliche Zeichenbreite annähert, so dass es eine GetTextExtentPoint32()
Funktion auf einem alphabetischen Zeichen gesetzt statt.
Siehe auch:
- Wie Dialogfeld-Einheiten zu berechnen, basierend auf der aktuellen Schriftart in Visual C ++
- Wie Dialog Basiseinheiten mit nicht-systembasierte Font berechnen
Einfachere alternative
Wenn die Tasten die einzige Kontrolle sind Sie automatisch skalieren möchten, können Sie auch a href verwenden <= „http://msdn.microsoft.com/en-us/library/bb775961(VS.85).aspx“ rel = "noreferrer"> BCM_GETIDEALSIZE
Nachricht Button_GetIdealSize()
Makro (Windows XP und oben nur) eine optimale Breite und Höhe abzurufen, die alles passt die Schaltfläche enthält, obwohl es ziemlich hässlich aussieht, ohne dass Ränder um den Text der Schaltfläche angelegt wird.
Andere Tipps
Dies ist, was MSDN zu sagen hat: Design-Spezifikationen und Richtlinien - Visuelles Design: Layout .
Die Standardgröße eines Knopfes ist 50x14 DLUs, die Pixel mit den gezeigten Beispielen für berechnet werden kann: GetDialogBaseUnits .
Die MapDialogRect Funktion scheint das zu tun Berechnung für Sie.
@macbirdie: Sie sollten nicht verwenden GetDialogBaseUnits () wird auf dem Standardsystemschrift basiert (Hässliche Bitmap-Schrift). Sie sollten MapDialogRect verwenden ()