Pregunta
¿Cómo creo un control de botón (con CreateWindow
de un BUTTON
clase de ventana) que tiene un tamaño estándar para todo el sistema (especialmente altura) que sea consistente con el resto de aplicaciones de Windows?Por supuesto, debería tener en cuenta el DPI y probablemente otras configuraciones.
Observación: Usando
USE_CW_DEFAULT
para ancho y alto da como resultado un botón de tamaño 0, 0, por lo que esa no es una solución.
Solución 2
En el mundo perfecto y sin complicaciones...
Para crear un botón de tamaño estándar tendríamos que hacer esto:
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);
dónde 50 y 14 son las respectivas dimensiones DLU, 4 y 8 son unidades de plantilla de diálogo horizontal y vertical respectivamente, basadas en GetDialogBaseUnits()
función observaciones de la documentación.
Nada es perfecto
PERO Como señaló Anders, esas métricas se basan en la fuente del sistema.Si su ventana usa una fuente de diálogo de shell o simplemente cualquier cosa que no le haga sangrar los ojos, está prácticamente solo.
Para obtener sus propias unidades base de "diálogo", debe recuperar las métricas de texto actuales con GetTextMetrics()
y use la altura del carácter y el ancho promedio (tmHeight
y tmAveCharWidth
del TEXTMETRIC
struct respectivamente) y traducirlos con MulDiv por su cuenta, a menos que estás en un diálogo, entonces MapDialogRect()
hará todo el trabajo por usted.
Tenga en cuenta que tmAveCharWidth
sólo se aproxima al ancho promedio real de caracteres, por lo que se recomienda utilizar un GetTextExtentPoint32()
funcionan en un conjunto de caracteres alfabéticos.
Ver:
- Cómo calcular las unidades del cuadro de diálogo según la fuente actual en Visual C++
- Cómo calcular unidades base de diálogo con fuentes no basadas en el sistema
Alternativa más sencilla
Si los botones son el único control cuyo tamaño desea cambiar automáticamente, también puede usar BCM_GETIDEALSIZE
mensaje Button_GetIdealSize()
macro (solo Windows XP y versiones posteriores) para recuperar el ancho y alto óptimos que se ajusten a todo lo que contiene el botón, aunque se ve bastante feo sin ningún margen aplicado alrededor del texto del botón.
Otros consejos
Esto es lo que MSDN tiene que decir: Especificaciones y pautas de diseño: diseño visual:Disposición.
El tamaño predeterminado de un botón es 50x14 DLU, que se puede calcular en píxeles utilizando los ejemplos que se muestran para Obtener unidades base de diálogo.
El MapaDialogoRect La función parece hacer el cálculo por usted.
@macbirdie:NO debe usar GetDialogBaseUnits(), ya que se basa en la fuente predeterminada del sistema (fuente de mapa de bits fea).Deberías usar MapDialogRect()