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 | < Назад | Оглавление | Далее > |