На главную
 

Изменение размера элементов внутри формы - Стр. 1

Изменение размеров элементов управления внутри форм с изменяемыми границами

Эта статья опубликована на сайте VBNet
в конкурсе на лучшую статью. Заняла 2-е место (из двух предложенных на конкурс :)

      Интерфейс пользователя, популяризированный компанией Microsoft, быстро завоевал пользователей своим чрезвычайным удобством. Главным принципом организации этого интерфейса можно считать то, что каждое приложение состоит из одного или более окон. Мы можем открыть несколько приложений и работать с ними одновременно. При этом одним из замечательных свойств окон является возможность их произвольного размещения на экране монитора.
      В этой статье мы затронем одну незначительную, но, на наш взгляд, все же важную тему - изменение размеров элементов управления внутри форм с изменяемыми границами. Стандартный набор функций окна не позволяет автоматически контролировать размеры элементов, принадлежащих форме, поэтому реализация задачи ложится на плечи программиста. На первый взгляд задача может показаться слишком простой, но ее практическое решение обнаруживает ряд важных нюансов, которые необходимо знать. Статья ориентированна на пользователей достаточно знакомых со средой разработки VB-приложений. Поэтому мы не будем останавливаться на инструкциях по добавлению в формы меню и элементов управления. Все изложенное касается исключительно решения поставленной задачи. Для начала создадим каркас приложения.

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

      Итак, создайте стандартный exe-проект. В единственную форму проекта Form1 добавьте хотя бы один элемент меню. Определите для формы следующие свойства:

   ScrollBars = false
   BorderStyle = 2  'Sizeable
      Теперь необходимо позаботиться о главных героях нашей статьи - элементах управления. Добавьте на форму текстовое поле Text1 и кнопку Button1. Расположите их так, чтобы текстовое поле занимало практически всю площадь формы, оставляя только место внизу для кнопки. Свойства Top и Left установите равными 0. Меню и элементы управления не будут играть никакой практической роли, - для нас будут важны лишь их размеры. Запустите проект. Результатом должно быть нечто похожее на Рис 1.

      А теперь попробуйте изменить размеры формы. Все элементы управления остаются на своих местах и при своих размерах. Для того чтобы элементы правильно позиционировались на форме, необходимо добавить в обработку события изменения размера формы соответствующий код. Мы должны закрепить некоторые параметры элементов управления относительно размеров формы-контейнера. Вычислите, например, разницу следующих свойств Form1.Width - Form1.Text1.Width. Число, которое мы получим - это разница между шириной формы и шириной текстового поля. Запомните его, для нас обозначим его как А. Очевидно, что при любых размерах формы эта разница должна оставаться постоянной.
      Аналогично определим разницу между высотой окна и высотой текстового поля: Form1.Height - Form1.Text1.Height. Эту разницу запомним как число В. Теперь добавьте в код формы следующий обработчик события изменения размера окна:

   Private Sub Form_Resize()
    
       Text1.Width = Me.Width - А
       Text1.Height = Me.Height - В
    
   End Sub
      Не забудьте вместо А и В вставить реальные значения, которые у Вас получились. Благодаря обработчику изменение размеров формы будет приводить к соответствующим изменениям в параметрах текстового поля. Запустите проект и снова поэкспериментируйте с изменением размеров окна. Размеры текстового окна изменяются правильно, а вот кнопка никак не реагирует. Что ж уважим и кнопку. Размеры кнопки можно оставлять постоянными, а вот ее положение по вертикали необходимо изменять при изменении размеров окна. Найдем еще одну разницу Form1.Height - Form1.Button1.Top. Для чего мы его вычисли, думаю пояснять не нужно. Запомним число как С. Модифицируйте обработчик события Resize следующим образом:
   Private Sub Form_Resize()
    
       Text1.Width = Me.Width - А
       Text1.Height = Me.Height - В
       Button1.Top = Me.Height - C

   End Sub
      Запустите проект. Теперь как бы все нормально, но это, к сожалению, до поры до времени. Вот тут и начинаются те самые нюансы, о которых было сказано в начале статьи. Таких нюансов можно по началу не заметить, но в процессе реального использования рано или поздно они все равно "всплывают".
      Попробуйте уменьшить размеры окна до совсем малых размеров. Возникает ошибка, когда мы пытаемся присвоить свойствам элементов отрицательные значения. Ширина окна должна быть достаточно для размещения кнопки с учетом расстояний до краев формы, т.е. не меньше, чем Button1.Width + TextWDiff. Что касается высоты, то нужно учесть, что кнопка не должна "залазить" на текстовое поле. Для этого необходимо оставить для нее место, равное ее высоте, а также зарезервировать место для текстового поля. Пускай, для простоты, эта величина будет равняться 2B.
      Чтобы меньше использовать условные обозначения, определим дополнительные переменные. Новый вариант обработчика имеет следующий вид:
   Private Sub Form_Resize()
    
       Dim TextWDiff As Integer
       Dim TextHDiff As Integer
       Dim ButtTDiff As Integer
    
       TextWDiff = А
       TextHDiff = В
       ButtTDiff = С
    
       If Me.Height < 2 * В Then Me.Height = 2 * В
       If Me.Width < Button1.Width + TextWDiff Then Me.Width = _
           Button1.Width + TextWDiff

       Text1.Width = Me.Width - TextWDiff
       Text1.Height = Me.Height - TextHDiff
       Button1.Top = Me.Height - ButtTDiff
    
   End Sub

На следующую страницу

К началу На главную
Designed by ProGa ®
Hosted by uCoz