Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 1380

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Clone

 

 

Создает точную копию объекта Region.

 

 

 

 

 

Обновляет

 

объект

Region,

чтобы

включить

Complement

 

 

 

 

 

 

часть указанной структуры RectangleF, не

 

 

 

пересекающуюся с объектом Region.

 

 

 

CreateObjRef

(унаследовано

от

Создает

объект,

который

 

содержит

всю

MarshalByRefObject)

 

 

необходимую

информацию

 

для

 

создания

 

 

 

прокси-сервера,

используемого

 

для

 

 

 

коммуникации с удаленными объектами.

 

 

Dispose

 

 

Освобождает все ресурсы, используемые

 

 

 

объектом Region.

 

 

 

 

 

 

 

 

Equals

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обновляет

 

объект

Region,

чтобы

включить

Exclude

 

 

 

 

 

 

часть

его

внутренней

 

части,

 

не

 

 

 

пересекающуюся с указанной структурой

 

 

 

Rectangle.

 

 

 

 

 

 

 

 

 

 

FromHrgn

 

 

Инициализирует

новый

объект

Region

из

 

 

 

дескриптора указанной существующей области

 

 

 

GDI.

 

 

 

 

 

 

 

 

 

 

 

GetBounds

 

 

Возвращает

 

структуру

 

 

RectangleF,

 

 

 

представляющую

 

объект

 

прямоугольник,

 

 

 

ограничивающий

 

 

Region

 

на

 

 

 

поверхности рисунка объекта Graphics.

 

GetHashCode (унаследовано от Object)

 

Служит хеш-функцией для конкретного

типа,

 

 

 

пригоден

для

использования

в

алгоритмах

 

 

 

хеширования и структурах данных,

например

 

 

 

в хеш-таблице.

 

 

 

 

 

 

 

 

 

GetHrgn

 

 

Возвращает дескриптор Windows для объекта

 

 

 

Region в указанном графическом контексте.

GetLifetimeService

(унаследовано

от

Извлекает

 

служебный объект

 

текущего

срока

MarshalByRefObject)

 

 

действия, который управляет средствами

 

 

 

срока действия данного экземпляра.

 

 

GetRegionData

 

 

Возвращает

 

 

объект

 

 

RegionData,

 

 

 

представляющий данные, описывающие объект

 

 

 

Region.

 

 

 

 

 

 

 

 

 

 

 

GetRegionScans

 

 

Возвращает массив структур RectangleF,

 

 

 

аппроксимирующих объект Region.

 

 

 

 

GetType (унаследовано от Object)

 

Возвращает Type текущего экземпляра.

 

 

 

 

Получает

служебный объект

срока

действия,

InitializeLifetimeService (унаследовано

от

MarshalByRefObject)

 

 

для управления средствами срока действия

 

 

 

данного экземпляра.

 

 

 

 

 

 

 

Intersect

 

 

Заменяет объект Region на

его

пересечение

 

 

 

с указанным объектом Region.

 

 

 

 

IsEmpty

 

 

Проверяет,

имеет

ли

объект

Region

пустую

 

 

 

внутреннюю часть на указанной поверхности

 

 

 

рисунка.

 

 

 

 

 

 

 

 

 

 

 

IsInfinite

 

 

Проверяет,

имеет

ли

объект

Region

пустую

 

 

 

внутреннюю часть на указанной поверхности

 

 

 

рисунка.

 

 

 

 

 

 

 

 

 

 

 

IsVisible

 

 

Проверяет,

содержится

ли

 

указанный

 

 

 

прямоугольник в объекте Region.

 

 

 

 

MakeEmpty

 

 

Инициализирует объект Region для пустой

 

 

 

внутренней части.

 

 

 

 

 

 

 

 

MakeInfinite

 

 

Инициализирует

 

объект

 

Region

 

для

 

 

 

бесконечной внутренней части.

 

 

 

 

ToString (унаследовано от Object)

 

Возвращает String, который представляет

 

 

 

текущий Object.

 

 

 

 

 

 

 

 

Transform

 

 

Преобразует этот объект Region с помощью

 

 

 

указанного объекта Matrix.

 

 

 

 

 

 

Translate

 

 

Смещает координаты объекта Region на

 

 

 

указанную величину.

 

 

 

 

 

 

 

Union

 

 

Заменяет объект Region на

его

объединение

 

 

 

с указанным объектом GraphicsPath.

 

 

Xor

 

 

Заменяет

 

объект

Region

 

на

 

разность

 

 

 

объединения и его пересечения с указанным

 

 

 

объектом GraphicsPath.

 

 

 

 

 

 

Защищенные методы

 

Переопределен. См. Object.Finalize.

 

 

Finalize

 

 

 

 

198


MemberwiseClone (унаследовано от Object)

В языках C# и C++ для функций финализации используется синтаксис деструктора. Создает неполную копию текущего Object.

Применение классов GraphicsPath и Region. Круглая форма

using System;

using System.Drawing;

using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms;

namespace StrangeControls

{

///<summary>

///Объявляется класс-наследник базового класса Form.

///Наша форма, конечно же, основывается на обычной классической

///прямоугольной, масштабируемой форме.

///Прежде всего, это означает,что у неё имеется свойство Size,

///значения которого используются для определения размеров

///составляющих нашу форму элементов.

///Наша форма состоит из двух элементов:

///Прямоугольника-заголовка (здесь должны размещаться основные элементы управления формы).

///Эллипсовидной клиентской области с голубой каёмочкой.

///</summary>

public class RoundForm : System.Windows.Forms.Form

{

private System.ComponentModel.Container components = null;

//Объект headSize используется для управления размерами формы. private Size headSize;

//bw - (border width) это переменная,

//сохраняющая метрические характеристики рамки.

//В дальнейшем это значение используется для определения

//размеров нашей формы.

int bw;

// Ничем не примечательный конструктор...

public RoundForm()

{

InitializeComponent();

}

#region Windows Form Designer generated code

///<summary>

///Required method for Designer support - do not modify

///the contents of this method with the code editor.

///</summary>

private void InitializeComponent()

{

//

// RoundForm

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Cursor = System.Windows.Forms.Cursors.Cross; this.MinimumSize = new System.Drawing.Size(100, 100); this.Name = "RoundForm";

this.Text = "RoundForm";

this.Resize += new System.EventHandler(this.RoundForm_Resize);

}

#endregion

///<summary>

///Clean up any resources being used.

199


/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

//Обработчик события, связанного с изменением формы окна обеспечивает

//вызов метода, в котором определяются основные характеристики

//составляющих формы.

private void RoundForm_Resize(object sender, System.EventArgs e)

{

SetSize();

}

//Код, определяюший габариты ФОРМЫ - весь здесь...

//Это определение метрических характеристик ФОРМЫ. protected void SetSize()

{

//Всего ничего...

//На основе соответствующей "классической" формы

//определяются размеры прямоугольной составляющей (заголовка формы). int w = this.Size.Width;

bw = (int)((w - this.ClientSize.Width)/2); int h = this.Size.Height;

int bh = h - this.ClientSize.Height - bw; headSize = new Size(w,bh);

}

//В рамках переопределённой виртуальной функции...

protected override void OnPaint(PaintEventArgs e)

{

//Определяем габариты формы.

SetSize();

//Получаем ссылку на графический контекст. Graphics gr = this.CreateGraphics();

//Карандаш для отрисовки каёмочки.

Pen pen = new Pen(SystemColors.Desktop,bw);

//Объект, поддерживающий контуры формы. GraphicsPath gp = new GraphicsPath();

//Контуры формы образуются прямоугольником

//(его характеристики совпадают с заголовком формы).

//класс GraphicsPath не имеет метода, который позволял

//бы непосредственно подсоединять прямоугольные области.

//Поэтому структура Rectangle предварительно определяется.

//С эллипсом проще. Он подсоединяется "на лету",

//без предварительного опредедления.

Rectangle rect = new Rectangle(0,0,headSize.Width,headSize.Height); gp.AddRectangle(rect); gp.AddEllipse(bw,headSize.Height,this.ClientSize.Width,this.ClientSize.Height);

//Сформировали объект, поддерживающий контуры формы.

//И на его основе создаём объект, который описывает внутреннюю часть

//графической формы.

//В нашем случае она состоит из прямоугольника и эллипса.

Region reg = new Region(gp);

//У любой формы имеется свойство Region.

//У нашей формы - он прекрасен. this.Region = reg;

//Рисуем каёмочку...

gr.DrawEllipse(pen,0,0,this.ClientSize.Width,this.ClientSize.Height);

//Освобождаем занятые ресурсы.

gr.Dispose();

}

200



}

}

Собственные элементы управления

В этом разделе обсуждаются некоторые аспекты проблемы построения собственных элементов управления.

Известно, по крайней мере, три возможных подхода к разработке новых элементов управления:

объединение стандартных элементов управления в группы (составные элементы управления),

объявление новых классов, наследующих от существующих элементов управления,

написание новых элементов “с нуля”.

Разработка составных элементов управления предполагает объявление класса, производного от класса UserControl и использование мастера UserControl, для добавления вложенных элементов управления с последующей настройкой образующих элементов.

Новый элемент управления может быть построен на основе класса-наследника какого-либо из существующих элементов управления. В этом случае в новом классе удаётся частично использовать функциональные возможности ранее объявленного класса, возможно, сохраняя при этом внешний вид элемента. Например, можно объявить собственный вариант класса кнопки, который будет наследовать классу Button.

Написание нового элемента “с нуля” отличается от предыдущего варианта разработки выбором базового класса. В этом случае основываются на классе Control, который не предоставляет потомкам даже элементарного графического интерфейса. Процесс визуализации в этом случае обеспечивается переопределяемым обработчиком события Paint. При этом переопределяется виртуальный метод базового класса OnPaint с единственным аргументом типа PaintEventArgs, который содержит информацию о клиентсой области элемента управления. Член этого класса объект типа Graphics обеспечивает формирование представление элемента управления. Второй член класса - объект типа ClipRectangle описывает доступную клентскую область элемента управления.

Следует отметить, что между двумя последними способами определения элементов управления не существует чётких границ. В обоих случаях основанием для классификации оказывается объём работы по доопределению и переопределению методов и свойств вновь создаваемого класса элементов управления.

В рассматриваемом ниже примере определения собственного элемента управления используется объект-представитель класса ImageList. Объекты этого класса предназначяются для сохранения рисунков, которые могут отображаться другими элементами управления. В общем случае этот компонент позволяет написать код для унифицированного каталога рисунков. В нашем случае он используется для изменения внешнего вида элемента управления. К каждому рисунку можно получить доступ с помощью значения индекса этого рисунка. Отображаемые рисунки имеют один и тот же формат и размер, устанавливаемый в свойстве ImageSize. Таким образом, на основе данного свойства может быть реализован эффект масштабирования элемента управления в смысле изменения его видимых размеров в случае изменения клиентских размеров формы.

using System;

using System.Collections; using System.ComponentModel; using System.Drawing;

using System.Drawing.Drawing2D; using System.Data;

using System.Windows.Forms;

namespace StrangeControls

{

///<summary>

///Summary description for RoundButton.

///Хотя класс RoundButton и объявляется на основе базового

///класса Button, внешнее представление его

///объектов-представителей реализуется в переопределяемом

///методе OnPaint с использованием класса ImageList.

201