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

Форма и ее клиентская область

Размеры, о которых я говорил, относятся к форме в целом — вместе с рамкой и заголовком. Как правило, приложение в первую очередь интересует размер клиентской области формы. Клиентская область — внутренняя область формы, на которой приложение при возникновении события Paint может размещать элементы управления и рисовать все, что сочтет нужным, и размещать элементы управления. В клиентскую область не входят заголовок и рамка формы. Если и форме под заголовком располагается меню (я расскажу о добавлении меню в главе 14), из клиентской области также исключается область, занятая меню. Если форма отображает полосы прокрутки справа и снизу окна (как это сделать, я покажу в главе 4), то из клиентской области также исключаются эти полосы прокрутки.

В классе Form только два свойства (изначально реализованные в Control), относящихся к размеру клиентской области:


Свойства Client (выборочно)



Тип Свойство Доступ

Size ClientSize Чтение/запись
Rectangle ClientRectangle Чтение


Свойство ClientSize показывает высоту и ширину клиентской области в пикселах. Свойство ClientRectangle не дает дополнительной информации по сравнению с ClientSize, потому что свойства X и Y ClientRectangle всегда равны 0! ClientRectangle иногда полезно в методах, которым требуются параметры Rectangle. Две последние программы этой главы иллюстрируют, как использовать Rectangle в этих целях.

Еще раз: избегайте присваивать значения свойствам свойств. Такое присваивание не будет работать:

  ClientSize.Width += 100;      // Не будет работать!

Вместо этого делайте так:

  ClientSize = new Size(ClientSize.Width + 100, ClientSize.Height);

Или так:

  ClientSize += new Size(100, 0);

Следующая программа показывает все 13 свойств, отвечающих за размер и местоположение клиентской области.

FormSize.cs

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

  class FormSize: Form
  {
       public static void Main()
       {
            Application.Run(new FormSize());
       }
       public FormSize()
       {
            Text = "Form Size";
            BackColor = Color.White;
       }
       protected override void OnMove(EventArgs ea)
       {
            Invalidate();
       }
       protected override void OnResize(EventArgs ea)
       {
            Invalidate();
       }
       protected override void OnPaint(PaintEventArgs pea)
       {
            Graphics grfx = pea.Graphics;
            string   str  = "Location: "        + Location        + "\n"   +
                            "Size: "            + Size            + "\n"   +
                            "Bounds: "          + Bounds          + "\n"   +
                            "Width: "           + Width           + "\n"   +
                            "Height: "          + Height          + "\n"   +
                            "Left: "            + Left            + "\n"   +
                            "Top: "             + Top             + "\n"   +
                            "Right: "           + Right           + "\n"   +
                            "Bottom: "          + Bottom          + "\n\n" +
                            "DesktopLocation: " + DesktopLocation + "\n"   +
                            "DesktopBounds: "   + DesktopBounds   + "\n\n" +
                            "ClientSize: "      + ClientSize      + "\n"   +
                            "ClientRectangle: " + ClientRectangle;

            grfx.DrawString(str, Font, Brushes.Black, 0, 0);
      }
  }

Эта несложная программа знакомит с парой вещей, с которыми мы раньше не сталкивались. Во-первых, переопределяются методы OnMove и OnResize. Префиксы On показывают, что данные методы связаны с событиями:


События Control (выборочно)



Событие Метод Делегат Параметр

Move OnMove EventHandler EventArgs
Resize OnResize EventHandler EventArgs


Эти методы вызываются, когда форма передвигается или изменяет размеры. В настоящем программировании метод OnMove почти никогда не переопределяется. Программы обычно не заботятся, где им расположиться на экране. Однако переопределение метода OnResize встречается довольно часто. Мы увидим массу примеров использования OnResize в следующих главах.

В ответ на оба этих события я вызываю простейшую из шести перегруженных версий метода Invalidate:


Методы Invalidate класса Control



void InvaLidate();
void Invalidate(Rectangle rectInvalid);
void Invalidate(bool bIncludeChildren);
void Invalidate(Rectangle rectInvalid, bool bIncludeChildren);
void Invalidate(Region rgnInvalid);
void Invalidate(Region rgnInvalid, bool bIncludeChildren};


Этот метод делает недействительной всю клиентскую область, или ее прямоугольное, или непрямоугольное подмножество; при этом дочерние элементы управления, размещенные в ней, в зависимости от параметра могут делаться или не делаться недействительными. Вызов Invalidate информирует Windows, что клиентская область больше не является действительной. В итоге форма получит вызов OnPaint, и вы сможете перерисовать клиентскую область. Вызов Invalidate — стандартный способ принудительной перерисовки окна программы.

Вызов OnPaint не произойдет сразу. Сначала должно выполниться текущее событие, обрабатываемое формой (в данном случае Resize или Move), и даже потом, если имеются другие необработанные события (например, ввод с клавиатуры или мыши), вызов OnPaint должен дожидаться своей очереди. Если нужно сразу обновить клиентскую область, после вызова Invalidate надо вызвать метод Update класса Control:


Методы Control (выборочно)



void Update();


Это приведет к немедленному вызову OnPaint; после того как OnPaint вернет управление, вернет управление и Update.

Программа FormSize также показывает объединение строк с объектами Point, Size и Rectangle. Когда вы помещаете свойство или другой объект в строку, как в этой программе, вызывается метод объекта ToString.

Кроме того, я задействовал преимущество метода DrawString, состоящее в том, что метод распознает символы перевода строки ASCII и правильно устанавливает промежутки между строками текста. И все же вывод немного неряшливый:


Рис. 3.1.

В следующей главе мы узнаем, как красиво расположить текст по столбцам.

У объекта Form есть четырнадцатое свойство, унаследованное от Control и связанное с размером клиентской области:


Свойства Client (выборочно)



Тип Свойство Доступ

Rectangle DisplayRectangle Чтение


По умолчанию это свойство такое же, как и ClientRectangle. Оно не изменяется, пока вы не начнете размещать элементы управления на клиентской области.


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

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