Pregunta

Estoy tratando de posicionar ciertos controles dentro de un formulario de manera programática, según la diferencia entre el tamaño mínimo de los formularios y el tamaño de su cliente. Desafortunadamente, esto produce resultados diferentes según el tema que el usuario haya cargado (en general, el problema parece deberse). al hecho de que la barra de título y el borde de formulario tienen diferentes alturas / anchos en diferentes temas). He intentado usar la altura de toda la ventana (incluida la barra de título, etc.) pero esto no parece funcionar como se esperaba :(

desafortunadamente, esto hace que los controles contenidos se desalineen. En este escenario de uso particular, el uso de controles de diseño automático (como el panel de diseño de flujo) no es una solución viable.

Debo estar perdiendo algo realmente obvio. ¿Hay alguna forma mejor de hacerlo?

Disculpas si esta pregunta suena tonta

Muchas gracias Dave

¿Fue útil?

Solución

La única forma que encontré de resolverlo con precisión es haciendo algo como:

int delta = this.Height - this.ClientRectangle.Height;

y luego usar eso cuando necesito basar algo en el cliente son de la forma (Lo usé cuando quería que un formulario se ajustara automáticamente a algunos botones y tuviera un borde igual alrededor de ellos).

Así que para ti:

int delta = this.Height - this.ClientRectangle.Height;
int actualMinHeight = this.MinimumSize.Height - delta;

HTH

Editar: Intenté usar las propiedades SystemInformation.Border3DSize y SystemInformation.BorderSize pero tampoco me dieron los anchos correctos.

Otros consejos

No estoy 100% seguro de que esté solicitando un medio para poder cambiar el tamaño de los controles dinámicamente en el tiempo de ejecución según la forma, el grosor del borde, el espaciado de los iconos, etc. Sin embargo, si esto se reduce, tengo la culpa. Para malinterpretar su pregunta, el artículo aquí en CodeProject . Dado que mencionó diferentes tamaños de bordes, etc., es posible que desee ver las métricas del sistema que controlan los tamaños de los bordes utilizando pinvokes GetSystemMetrics, eche un vistazo aquí para tal cosa, y aquí . Consulte también pinvoke.net sitio web para GetSystemMetrics.

Espero que esto ayude, Atentamente, Tom.

Para cualquiera que también se tropiece con este problema, la mejor solución que la gente buena aquí pudo encontrar fue usar algo como:

Dim clientRectDelta As Integer = Me.Height - Me.ClientRectangle.Height - (SystemInformation.Border3DSize.Height * 2)
Dim actualMinimumHeight As Integer = Me.MinimumSize.Height - clientRectDelta
Dim deltaHeight As Integer = Me.ClientRectangle.Height - actualMinimumHeight

Sin embargo, esto ignora las alturas dependientes del tema específico de control (es decir, la altura de los encabezados de columna en las vistas de lista cambia, lo que parece alterar la altura general de la vista de lista, lo que puede causar superposiciones, etc.), pero parece que funciona principalmente.

¡Muchas gracias a Pondidum, tommieb75 y nobugz que ayudaron con este problema! (perdón por todos, pero actualmente no tengo suficiente reputación para marcar todas sus respuestas hasta +1).

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