Как рассчитать минимальный размер _client_ формы Windows .net? - PullRequest
3 голосов
/ 27 ноября 2009

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

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

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

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

Большое спасибо Dave

Ответы [ 3 ]

5 голосов
/ 27 ноября 2009

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

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

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

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

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

НТН

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

0 голосов
/ 27 ноября 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

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

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

0 голосов
/ 27 ноября 2009

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

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

...