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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top