Центрирование элементов при изменении размера окон в VB6

Я создаю приложение на VB6, где стандартный размер формы составляет 1024x768 для старых мониторов, которые его увидят. Однако некоторым пользователям будут доступны более высокие разрешения, и я бы хотел, чтобы программа по-прежнему выглядела красиво, когда они максимизируют экран. Я вообще не хочу изменять размер элементов в форме, но я хочу все центрировать. Есть два варианта, как я вижу, и мне не очень нравится ни один из них:

  • _Настоящий_ способ, написание динамического кода, который будет размещать каждый элемент в форме по отношению к другим элементам, так что независимо от его размера, они всегда будут центрироваться должным образом.
  • Более простой, но более простой способ — поместить все элементы в PictureBox размером 1024x768 и просто центрировать его на экране при изменении размера формы.

Мне не нравится первый, потому что тьфу, и я не люблю второй, потому что это такое специальное решение. Кроме того, хотя мне больше нравится идея, лежащая в основе первого, у него есть проблема постоянства: если мне нужно вернуться и изменить некоторые элементы, я тогда застряну, переписывая много кода для изменения положения. И у второго есть своего рода аналогичная проблема, из-за которой я потерял бы одну из приятных вещей, которые предоставляет VB6: возможность видеть структуру сетки формы.

Кто-нибудь знает какие-нибудь волшебные решения?

В настоящее время я склоняюсь к PictureBox, просто потому, что перспектива написания и, несомненно, переписывания всего этого кода позиционирования угнетает. Проблема здесь в том, что у меня уже есть эти 50+ элементов в форме, но мне нужно, чтобы они были в PictureBox. Я могу копировать и вставлять без создания массива, который он всегда хочет создать, но тогда мне придется пройти через переименование их всех... так что мой второй вопрос, есть ли какой-нибудь простой способ передать уже существующий элемент в превратиться в PictureBox?

Всем спасибо!


person erekalper    schedule 03.03.2011    source источник
comment
Честно говоря, второе решение, которое вы описали, не является случайным - оно организовано. Пользовательский интерфейс — это все о контейнерах. Когда вы разрабатываете пользовательский интерфейс, вы группируете группы связанных элементов; эта метафора применима и к реализации этого пользовательского интерфейса. Я думаю, что вас сбивает с толку то, что вы неправильно используете PictureBox. Лемми, посмотри, есть ли элементы VB6, предназначенные для группировки элементов управления...   -  person slifty    schedule 03.03.2011
comment
Ни один из вариантов на самом деле не улучшает пользовательский интерфейс. Просто будут более крупные полосы серого линкора, на самом деле больше не на что смотреть. Например, список, который не нужно так часто прокручивать, или сетка, которая показывает больше строк. Пока вы обдумываете это, просто ничего не делайте. Эти полосы серого цвета вполне могли бы жить справа и снизу.   -  person Hans Passant    schedule 04.03.2011
comment
Я бы просто запретил максимизировать и, возможно, контролировать диапазон размеров в событии Resize. Если вы настаиваете на этой глупой максимизации и центрировании, используйте UserControl вместо PictureBox. Вы можете выбрать все элементы управления с помощью Shift для расширенного выбора или заарканить их с помощью мыши, а затем вырезать и вставить в выбранный вами контейнер.   -  person Bob77    schedule 04.03.2011
comment
@Hans Passant - я симметричный парень. Я бы предпочел приятные даже полосы скучного. @Bob Riemersma - я не думаю, что это безумно глупо позволять кому-то максимизировать окно и центрировать объекты ... это не обязательно, нет, но иногда просто приятно иметь развернутое окно. Но с вырезанием и вставкой... боже мой, я чувствую себя идиотом. facepalm Я забыл, что существует вырезание, я был так сосредоточен на попытке обойти создание массива при копировании.   -  person erekalper    schedule 04.03.2011


Ответы (3)


Бесплатных обедов не бывает. Если вы хотите, чтобы ваше приложение VB6 "выглядело красиво" при изменении размера, вам необходимо написать логику динамического изменения размера в событии Form_Resize. В противном случае, как заявляли другие, у вас будут большие серые области со всем, что забито в верхнем левом углу. Центрирование в PictureBox не намного лучше. В любом случае это будет выглядеть нестандартно и дилетантски.

Я написал этот тип кода для нескольких приложений VB6. Соглашусь, что немного утомительно писать, но это не сложно. Просто нужно подумать:

  • Расположение кнопок. Нижние правые координаты вашей формы изменятся, и кнопки обычно размещаются вдоль правой стороны или относительно нижнего правого угла.
  • Изменение размера элемента управления отображением. Вы можете расширять списки, многострочные текстовые поля, раскрывающиеся списки и т. д. Ваш код может решить, должны ли они быть в процентах от новой ширины/высоты формы или должны расширяться, чтобы заполнить то, что осталось после того, как вы разместили все. еще. Я думаю, что последний подход работает лучше, но это зависит от приложения.
  • Поле между элементами управления и краями формы, а также поле между самими элементами управления. Я определяю значение с именем «Gutter» для хранения этого значения, а затем применяю его по мере необходимости при позиционировании, скажем, ряда кнопок по горизонтали относительно нижнего правого угла.
  • Не изменяйте размер кнопок или меток, просто перемещайте их.
  • Не изменяйте размер шрифтов.

Свойства типа «привязка» делают этот тип кода ненужным в VB.NET. Если вы задумаетесь об этом на минуту, вы увидите, что если несколько свойств могут обрабатывать эту логику, строки кода, необходимые для того же, не могут быть такими уж сложными. После того, как вы определили положение и размер первого элемента управления, вы можете основывать другие положения элементов управления на основе верхнего, левого, ширины и высоты этого элемента управления и просто перемещаться по форме.

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

person JeffK    schedule 04.03.2011
comment
Я надеялся, что бесплатный обед может прийти в виде свойств Anchor, но я думаю, что с этой старой версией программного обеспечения мне не повезло. Это на самом деле полностью ответило на мой вопрос, что волшебного решения нет. Спасибо ДжеффК. - person erekalper; 04.03.2011
comment
Кажется, что изменение размера логики всегда пугает людей, но на самом деле это не так уж и важно. Начните с верхнего левого и нижнего правого, установите элементы управления в соответствующие размеры, используя расположение элементов управления, которые находятся непосредственно над/слева и ниже/справа от них. Работайте посередине (там, где обычно есть одна основная сетка/список/многострочное текстовое поле, и готово. Конечно, это несколько строк кода, но это не имеет большого значения. Создайте несколько констант, чтобы установить размеры пэдов 8 -12 пикселей (или эквивалентные твипы), чтобы было немного проще. - person DarinH; 05.03.2011
comment
Одна важная оптимизация, которую нужно сделать, когда вы делаете это, — это использовать метод item .Move для перемещения и изменения размера. Вы обнаружите, что это значительно быстрее, чем установка всех свойств по отдельности. .Move принимает верхнее, левое, ширину и высоту, поэтому вы можете делать с ним и то, и другое. - person Steve Massing; 10.03.2011

Если элементы не собираются изменять размер или положение по отношению друг к другу, я, вероятно, выберу подход PictureBox. Я не понимаю, как это было бы плохо на самом деле.

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

person Fredrik Mörk    schedule 03.03.2011
comment
Как я уже сказал slifty, я, вероятно, прибегну к этому подходу либо с PictureBox, либо с Frame. Мне просто неинтересно тратить время на изменение размера/центрирования кода. Спасибо! - person erekalper; 04.03.2011

http://www.functionx.com/vbnet/Lesson08.htm

Посмотрите на Контейнеры управления. Как я отметил в комментарии, второе решение, которое вы описали, не является специальным - оно организовано. Пользовательский интерфейс — это все о контейнерах.

Однако вы правы, чувствуя неприязнь к PictureBox.

person slifty    schedule 03.03.2011
comment
С контейнерами у меня все в порядке, просто VB6 не особо их предоставляет. У вас есть PictureBox и Frame. Я, вероятно, выберу Frame только потому, что это звучит менее... неправильно. - person erekalper; 04.03.2011
comment
Я считаю, что именно для этого и предназначены кадры. - person slifty; 04.03.2011
comment
Я думаю, вы забываете о UserControl, который может быть прекрасным контейнером. Вы можете использовать их как есть или использовать для создания пользовательских контейнеров элементов управления (см. Свойство ControlContainer в документации VB6). - person Bob77; 04.03.2011
comment
Я посмотрю на это. Забыл сказать, когда отвечал на ваш предыдущий комментарий. Спасибо! - person erekalper; 04.03.2011
comment
Также стоит отметить, что фреймы не могут получить фокус, что не критично для этого обсуждения, но имеет вес, если учесть другой вопрос, который я задал несколько дней назад. - person erekalper; 04.03.2011
comment
Ссылка на самом деле не отвечает на вопрос. В нем обсуждается VB.NET, а не VB 6. Доступны совершенно другие наборы элементов управления с совершенно разной функциональностью. Если бы вопрос был о VB.NET, ответ был бы простым: используйте свойства Anchor и Dock для выравнивания элементов управления на форме. В VB 6 вам нужно написать код изменения размера самостоятельно. - person Cody Gray; 07.04.2011