Domanda

Come posso creare un controllo pulsante (con CreateWindow di un BUTTON window class) che ha una dimensione standard a livello di sistema (in particolare l'altezza) coerente con il resto delle applicazioni Windows?Ovviamente dovrei tenere conto del DPI e probabilmente di altre impostazioni.

Nota: Utilizzando USE_CW_DEFAULT per larghezza e altezza risulta in un pulsante di dimensione 0, 0, quindi non è una soluzione.

È stato utile?

Soluzione 2

Nel mondo perfetto e senza problemi...

Per creare un pulsante di dimensioni standard dovremmo fare questo:

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);

Dove 50 E 14 sono le rispettive dimensioni DLU, 4 E 8 sono rispettivamente le unità del modello di dialogo orizzontale e verticale, basate su GetDialogBaseUnits() funzione osservazioni sulla documentazione.


Niente è perfetto

MA come ha sottolineato Anders, tali parametri si basano sul carattere del sistema.Se la tua finestra utilizza un carattere di dialogo della shell o semplicemente qualsiasi cosa che non ti faccia sanguinare gli occhi, sei praticamente da solo.

Per ottenere le tue unità base di "dialogo", devi recuperare le metriche di testo correnti con GetTextMetrics() e utilizza l'altezza del carattere e la larghezza media (tmHeight E tmAveCharWidth del TEXTMETRIC struct rispettivamente) e tradurli con MulDiv da solo, salvo che sei in una finestra di dialogo, allora MapDialogRect() farà tutto il lavoro per te.

Notare che tmAveCharWidth si avvicina solo alla larghezza media effettiva del carattere, quindi è consigliabile utilizzare a GetTextExtentPoint32() funzione invece su un set di caratteri alfabetici.

Vedere:


Alternativa più semplice

Se i pulsanti sono l'unico controllo che desideri ridimensionare automaticamente, puoi anche utilizzare BCM_GETIDEALSIZE Messaggio Button_GetIdealSize() macro (solo Windows XP e versioni successive) per recuperare la larghezza e l'altezza ottimali che si adattano a tutto ciò che contiene il pulsante, anche se sembra piuttosto brutto senza margini applicati attorno al testo del pulsante.

Altri suggerimenti

Questo è ciò che MSDN ha da dire: Specifiche e linee guida di progettazione - Design visivo:Disposizione.

La dimensione predefinita di un pulsante è 50x14 DLU, che può essere calcolata in pixel utilizzando gli esempi mostrati per GetDialogBaseUnits.

IL MapDialogRect sembra che la funzione esegua il calcolo per te.

@macbirdie:NON dovresti usare GetDialogBaseUnits(), è basato sul carattere di sistema predefinito (carattere bitmap brutto).Dovresti usare MapDialogRect()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top