| 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 и правильно устанавливает промежутки между строками текста. И все же вывод немного неряшливый:

В следующей главе мы узнаем, как красиво расположить текст по столбцам.
У объекта Form есть четырнадцатое свойство, унаследованное от Control и связанное с размером клиентской области:
Свойства Client (выборочно)
| Тип | Свойство | Доступ |
| Rectangle | DisplayRectangle | Чтение |
По умолчанию это свойство такое же, как и ClientRectangle. Оно не изменяется, пока вы не начнете размещать элементы управления на клиентской области.
| netlib.narod.ru | < Назад | Оглавление | Далее > |