Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5636 / 790 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 17:

GDI+

Region

Класс Region (Область) предназначается для создания объектов, которые описывают внутреннюю часть графической формы из прямоугольников и фигур, составленных из замкнутых линий. Этот класс не наследуется.

Область является масштабируемой. Приложение может использовать области для фиксации выходных данных операций рисования. Диспетчер окон применяет области для определения области изображения окон. Эти области называются вырезанными. Приложение может также использовать области в операциях проверки наличия данных, например пересечения точки или прямоугольника с областью. Приложение может заполнять область с помощью объекта Brush.

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

Список членов класса представляется ниже.

Открытые конструкторы
Region -конструктор Инициализирует новый объект Region
Открытые методы
Clone Создает точную копию объекта Region
Complement Обновляет объект Region, чтобы включить часть указанной структуры RectangleF, не пересекающуюся с объектом Region
CreateObjRef (унаследовано от MarshalByRefObject ) Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для коммуникации с удаленными объектами
DisposeEquals Освобождает все ресурсы, используемые объектом Region
Exclude Обновляет объект Region, чтобы включить часть его внутренней части, не пересекающуюся с указанной структурой 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
Защищенные методы
Finalize Переопределен. См. Object.Finalize.

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

MemberwiseClone (унаследовано от Object ) Создает неполную копию текущего Object

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

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

 namespace StrangeControls
 {

 // Объявляется класс – наследник базового класса Form.
 // Наша форма, конечно же, основывается на обычной классической
 // прямоугольной, масштабируемой форме.
 // Прежде всего это означает, что у нее имеется свойство Size,
 // значения которого используются для определения размеров
 // составляющих нашу форму элементов.
 // Наша форма состоит из двух элементов:
 // прямоугольника-заголовка
 // (здесь должны размещаться основные элементы управления формы);
 // эллипсовидной клиентской области с голубой каемочкой.    

 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

 // Required method for Designer support – do not modify
 // the contents of this method with the code editor.

 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

 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();
 }
 }
 }
Листинг 17.4.
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2