como é que se calcular o tamanho mínimo _Client_ de um .net janelas formar?
Pergunta
Eu estou tentando posicionar programaticamente certos controles dentro de um formulário, com base na diferença entre o tamanho mínimo formas e seu tamanho cliente - este, infelizmente, produz resultados diferentes dependendo de qual tema o usuário tenha carregado (principalmente o problema parece ser devido para o facto de que a barra de título e forma fronteira têm diferentes alturas / larguras em diferentes temas). Eu tentei usar a altura de toda a janela (incluindo o título bar etc), mas isso não parece trabalho conforme o esperado: (
este, infelizmente, faz com que continham controles para desalinhar. neste cenário de uso particular, a utilização de controlos de layout automático (tal como o painel do layout de fluxo) não é uma solução viável.
que deve estar faltando algo realmente óbvio -? Existe uma maneira melhor de fazer isso
Desculpas se esta pergunta soa mudo
Muitos agradecimentos Dave
Solução
A única maneira que eu encontrei de trabalhar com precisão para fora é fazer algo como:
int delta = this.Height - this.ClientRectangle.Height;
e, em seguida, usar isso sempre que eu preciso de base algo fora do cliente são da forma (Eu usei quando eu queria uma forma de auto tamanho de alguns botões, e tem uma fronteira igual ao seu redor).
Então, para você:
int delta = this.Height - this.ClientRectangle.Height;
int actualMinHeight = this.MinimumSize.Height - delta;
HTH
Edit:. Eu tentei usar as propriedades SystemInformation.Border3DSize
e SystemInformation.BorderSize
mas eles também não deu as larguras corretas para me
Outras dicas
Não estou 100% de certeza se você está pedindo um meio para ser capaz de redimensionar controles dinamicamente em tempo de execução com base na forma, espessura da borda, ícone espaçamento etc, no entanto, se isso fica downvoted, eu tenho minha culpa para mal-entendido a sua pergunta, o artigo aqui na CodeProject . Desde que você mencionou fronteira diferente tamanhos etc, que você pode querer olhar para as métricas do sistema que controla os tamanhos da beira usando GetSystemMetrics pinvokes, ter um olhar aqui para tal coisa uma e aqui . Olhe aqui também no pinvoke.net site para os GetSystemMetrics.
Espero que isso ajude, Cumprimentos, Tom.
Para qualquer um que tropeça sobre este problema, bem como, a melhor solução as boas pessoas aqui poderia encontrar era usar algo ao longo das linhas de:
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
No entanto, esta ignora quaisquer alturas dependentes tema específico de controlo (isto é, a altura de cabeçalhos das colunas em mudança de listas, que parecem alterar a altura total do listview, o que pode causar a sobreposição etc) - mas parece principalmente trabalho <. / p>
Um grande obrigado a Pondidum, tommieb75 e nobugz que ajudou com este problema! (Desculpe a todos, mas eu não tenho atualmente reputação suficiente para marcar todas as suas respostas até +1).