netlib.narod.ru< Назад | Оглавление | Далее >

Производим стыковку

Теперь разберемся со стыковкой (docking). Вот значения перечисления DockStyle:


Перечисление DockStyle



Член Значение

None 0
Top 1
Bottom 2
Left 3
Right 4
Fill 5


Во-первых, обратите внимание на то, что эти значения — не битовые флаги. Эти стили нельзя комбинировать вместе. Значением по умолчанию является DockStyle.None.

Если установить свойство Dock равным одному из четырех значений DockStyle, соответствующих сторонам, элемент управления будет прижат к этой стороне по всей длине, при этом элемент будет касаться двух прилегающих сторон. Например, если указать стиль DockStyle.Top, элемент управления будет находиться в самом верху клиентской области, а его ширина будет равна ширине клиентской области. При увеличении ширины формы ширина элемента управления тоже будет увеличиваться.

«Заякоривание» элемента обычно не вызывает изменения его размеров. Они изменяются, только если он привязан к противоположным сторонам и размер формы изменяется. Но если разместить элемент управления на одной из сторон, сделать его ширину или высоту равной длине этой стороны и указать свойство Anchor равным комбинации значений AnchorStyles, соответствующим этим трем смежным сторонам, результат будет таким же, как если бы элемент управления был пристыкован к этой стороне.

Вот еще одна версия TwoButtons, где две кнопки пристыковываются к верхней и нижней сторонам:

TwoButtonsDock.cs

  //-----------------------------------------------
  // TwoButtonsDock.cs (C) 2001 by Charles Petzold
  //-----------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class TwoButtonsDock: Form
  {
      public static void Main()
      {
          Application.Run(new TwoButtonsDock());
      }
      public TwoButtonsDock()
      {
          Text = "Two Buttons with Dock";
          ResizeRedraw = true;

          Button btn = new Button();
          btn.Parent = this;
          btn.Text   = "&Larger";
          btn.Height = 2 * Font.Height;
          btn.Dock   = DockStyle.Top;
          btn.Click += new EventHandler(ButtonLargerOnClick);
          
          btn = new Button();
          btn.Parent = this;
          btn.Text   = "&Smaller";
          btn.Height = 2 * Font.Height;
          btn.Dock   = DockStyle.Bottom;
          btn.Click += new EventHandler(ButtonSmallerOnClick);
      }
      void ButtonLargerOnClick(object obj, EventArgs ea)
      {
          Left   -= (int)(0.05 * Width);
          Top    -= (int)(0.05 * Height);
          Width  += (int)(0.10 * Width);
          Height += (int)(0.10 * Height);
      }
      void ButtonSmallerOnClick(object obj, EventArgs ea)
      {
          Left   += (int)(Width  / 22f);
          Top    += (int)(Height / 22f);
          Width  -= (int)(Width  / 11f);
          Height -= (int)(Height / 11f);
      }
  }

Здесь я отказался от переменных cxBtn, cyBtn и dxBtn и просто устанавливаю свойство Height каждой кнопки вдвое больше заданной по умолчанию высоты шрифта. Свойство Dock располагает кнопку у указанной стороны и делает ее ширину равной длине стороны:


Рис. 12.10.

Пристыковывание редко используют для кнопок! Гораздо интересней пристыковывать панели инструментов (к верхней стороне) и строки состояния (к нижней). Я покажу эти методы в главе 20. Кроме того, пристыковка имеет смысл в программах вроде Windows Explorer, в которых древовидный список пристыкован к левой стороне клиентской области, обычный список — справа, а посредине — разделитель. Такие программы мы рассмотрим в главе 22.

А что, если пристыковать два элемента управления к одной стороне? Вам, верно, будет приятно узнать, что при пристыковке к одной стороне элементы не перекрываются — они выстраиваются в «очередь» к краю. Так, если в программе TwoButtonsDock присвоить свойству Dock двух кнопок значение DockStyle.Top, кнопки буду выглядеть так:


Рис. 12.11.

Кажется, что позже созданный элемент управления расположен ближе к краю. На самом деле расположение элементов управления основано на понятии z-порядка (z-order), о котором я еще расскажу.

Теперь о DockStyle.Fill. Я использовал DockStyle.Fill в программе AnalogClock из главы 10, чтобы элемент управления «часы» занимал всю клиентскую область формы. Не следует задавать свойство Dock равным DockStyle.Fill, более чем для одного элемента управления. Элемент управления занимает всю клиентскую область, но не перекрывает другие элементы управления, у которых Dock отлично от значения по умолчанию.

Помните: в свойствах Anchor и Dock нет ничего сверхъестественного! Всю их функциональность можно реализовать в методе OnResize.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz