2009-11-27 1 views
3

Я пытаюсь программно позиционировать определенные элементы управления в форме, основываясь на различии минимального размера форм и его размера клиента - это, к сожалению, приводит к различным результатам в зависимости от темы, которую пользователь загрузил (в основном проблема связана с тот факт, что строка заголовка и граница формы имеют разную высоту/ширину в разных темах). Я попытался использовать высоту всего окна (включая строку заголовка и т. Д.), Но это, похоже, не работает должным образом :(Как вычислить минимальный размер _client_ формы .net windows?

это, к сожалению, приводит к тому, что элементы управления содержат несоответствие. В этом конкретном сценарии использования использование автоматического Расположение органов управления (например, панели макета потока) не является жизнеспособным решением

Я должен что-то действительно очевидное отсутствие -.? есть ли лучший способ сделать это

извинения, если этот вопрос звучит немой

Many Thanks Dave

ответ

5

Единственный способ я нашел точного работать его, чтобы сделать что-то вроде:

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

, а затем использовать, что когда-либо мне нужно основание что-то от клиента имеют вид (я использовал его когда я хотел, чтобы форма была автоматической для некоторых кнопок и имела равную границу вокруг них).

Так что для вас:

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

НТН

Edit: Я попытался с помощью SystemInformation.Border3DSize и SystemInformation.BorderSize свойства, но они также не дают правильные ширины для меня.

+0

Большое спасибо за ваш ответ - я дал этот снимок, и он почти работает :), однако он, кажется, игнорирует высоту верхней и нижней границ (то есть около 4 пикселей) - я иду попробуйте использовать GetSystemMetrics (SM_CYBORDER), чтобы узнать, работает ли это. – fusi

+0

, возможно, вы можете найти 'SystemInformation.Border3DSize' в сочетании с' delta'. – Pondidum

+0

в конечном итоге происходит с этим: Dim clientRectDelta As Integer = Me.Height - Me.ClientRectangle.Height - (SystemInformation.Border3DSize.Height * 2) и просто дать немного больше пространства вокруг вещей, так что разница в несколько пикселей is not that заметно - действительно разочарован, что что-то, что должно быть простым, - это ничего :(( Большое спасибо за вашу помощь по этому вопросу, вы все очень помогли мне в этом - окончательный ответ, похоже, не существует, как кажется я хочу, чтобы я понял, что я был близок к тому, что я собираюсь. Спасибо за ваш ответ. – fusi

0

Я не уверен на 100%, если вы просите, чтобы иметь возможность изменять размеры элементов управления динамически во время выполнения на основе формы, толщины границы, интервала между значками и т. Д., Однако, если это будет уменьшено, я сам винить за непонимание вашего вопроса, статью здесь, на CodeProject. Поскольку вы упомянули разные размеры границ и т. Д., Вы можете посмотреть на системные показатели, которые управляют размерами границ, используя pinvokes GetSystemMetrics, посмотрите на here для такой вещи и here. Посмотрите здесь также на pinvoke.net website для GetSystemMetrics.

Надеюсь, это поможет, С уважением, Tom.

+0

Спасибо за ваш ответ - извините, я не был очень ясен, позвольте мне уточнить: Мне нужно перемещать/изменять размеры элементов управления на основе ClientSize и MinimumSiz e формы - im собирается попробовать GetSystemMetrics сейчас и se, если это поможет. Я немного разочарован тем, что должно быть так просто, оказывается довольно неудобным. почему на земле есть свойство MinimumSize, основанное на общей высоте окна, а не на его высоте клиента ?! Argh! – fusi

0

Для тех, кто натыкается на эту проблему, а также, самое лучшее решение хорошие люди здесь могли бы найти в том, чтобы использовать что-то вдоль линий:

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 

Однако, это игнорирует управления конкретной темой зависимых высот (т.е. высота заголовков столбцов в списке просмотров, которые, как представляется, изменяют общую высоту списка, что может вызвать перекрытия и т. д.), но, похоже, в основном работает.

Большое спасибо Pondidum, tommieb75 и nobugz, которые помогли с этой проблемой! (извините, но у меня нет достаточной репутации, чтобы отметить все ваши ответы до +1).

+0

вы можете принять ответ, хотя! (тик слева от всех наших ответов, вы можете принять только один) – Pondidum