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.

¿Fue útil?

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:


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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top