как рассчитать минимальный размер _client_ формы Windows .net?

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

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

Должно быть, я упускаю что-то действительно очевидное - есть ли лучший способ сделать это?

Извините, если этот вопрос звучит глупо

Большое спасибо Дэйв


person fusi    schedule 27.11.2009    source источник


Ответы (3)


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

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

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

Итак, для вас:

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

HTH

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

person Pondidum    schedule 27.11.2009
comment
Большое спасибо за ваш ответ - я сделал снимок, и он почти работает :), однако, похоже, игнорируется высота верхней и нижней границ (то есть около 4 пикселей) - я собираюсь попробовать и используйте GetSystemMetrics (SM_CYBORDER), чтобы проверить, работает ли это .. - person fusi; 27.11.2009
comment
тогда вы можете найти SystemInformation.Border3DSize в сочетании с delta. - person Pondidum; 27.11.2009
comment
закончилось так: Dim clientRectDelta As Integer = Me.Height - Me.ClientRectangle.Height - (SystemInformation.Border3DSize.Height * 2) и просто предоставил немного больше места вокруг вещей, так что разница в несколько пикселей не так заметна - на самом деле разочарован тем, что что-то, что должно быть простым, совсем не так :( Большое спасибо за вашу помощь в этом вопросе, вы все очень помогли мне в этом - окончательного ответа, похоже, не существует, поскольку это кажется сложной проблемой, и я думаю Я подошел так близко, как собираюсь. Еще раз спасибо! - person fusi; 27.11.2009

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

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

person t0mm13b    schedule 27.11.2009
comment
Спасибо за ваш ответ - извините, я не очень ясен, позвольте мне уточнить: мне нужно переместить / изменить размер элементов управления на основе ClientSize и MinimumSize формы - я собираюсь попробовать GetSystemMetrics сейчас и посмотреть, поможет ли это. Я немного разочарован, что то, что должно было быть таким простым, оказалось довольно неудобным. почему свойство MinimumSize основано на общей высоте окна, а не на высоте его клиента ?! ах! - person fusi; 27.11.2009

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

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

person fusi    schedule 27.11.2009
comment
вы можете принять ответ! (галочка слева от всех наших ответов, вы можете принять только один) - person Pondidum; 27.11.2009