Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Тип Point (PointF)



Первый служебный тип, о котором вам следует знать — это System.Drawing.Point (PointF). В отличие от иллюстративных типов Point, которые создавались в начальных главах, тип GDI + Point (PointF) поддерживает ряд полезных членов, включая:

Для иллюстрации работы со служебными типами GDI + рассмотрим пример консольного приложения (по имени UtilTupes), которое использует тип System.Drawing.Point (не забудьте ссылку на System.Drawing.dll):

using System;

using System.Drawing;

namespace UtilTypes

{

public class Program

{

static void Main(string[] args)

{

// Создание и смещение точки.

Point pt = new Point(100, 72);

Console.WriteLine(pt);

pt.Offset(20, 20);

Console.WriteLine(pt);

// Перегруженные операции Point.

Point pt2 = pt;

if(pt == pt2)

WriteLine("Points are the same");

else

WriteLine("Different points");

// Изменить в pt2 значение X.

pt2.X = 4000;

// Теперь показать каждое значение X.

Console.WriteLine("First point: {0} ", pt);

Console.WriteLine("Second point: {0} ", pt2);

Console.ReadLine();

}

}

}

Тип Rectangle (RectangleF)

Тип Rectangle, как и Point, полезен во многих приложениях (как на основе GDI, так и нет). Один из наиболее полезных методов типа Rectangle — это Contains (). Этот метод позволяет определять, находится ли данный экземпляр Point или Rectangle в пределах текущих границ другого объекта. Далее в этой главе вы увидите применение этого метода для выполнения проверки попадания на изображения GDI +. А пока рассмотрим простой пример:

static void Main(string[] args)

{

...

// Point изначально вне границ прямоугольника.

Rectangle r1 = new Rectangle(0, 0, 100, 100);

Point pt3 = new Point(101, 101);

if(r1.Contains(pt3))

Console.WriteLine("Point is within the rect!");

else

Console.WriteLine("Point is not within the rect!");

// Теперь поместим точку внутрь прямоугольника.

pt3.X = 50;

pt3.Y = 30;

if(r1.Contains(pt3))

Console.WriteLine("Point is within the rect!"); // внутри

else

Console.WriteLine("Point is not within the rect!"); // не внутри

Console.ReadLine();

}

Класс Region

Тип Region представляет внутреннюю часть геометрической фигуры. Исходя из этого определения, имеет смысл, что конструкторы класса Region требуют передачи им некоторого существующего геометрического шаблона. Например, предположим, что создан прямоугольник размером 100х100 пикселей. Если вы хотите получить доступ к внутренней области этого прямоугольника, то можете написать нечто вроде такого:

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

Rectangle r = new Rectangle(0, 0, 100, 100);

Region rgn = new Region(r);

Имея внутренние размеры заданной фигуры, можно манипулировать ею, используя различные члены этого класса, включая перечисленные ниже.

Перечисленый состав функций делает понятной основную идею, положенную в основу этих координатных примитивов. Но, если нужны дополнительные детали, следует обратиться к документации по.NET Framework 2.0 SDK.

Класс Graphics

Класс System.Drawing.Graphics — это ворота в функциональность визуализации GDI +. Этот класс не только представляет поверхность рисования (такую, как поверхность формы, поверхность элемента управления или область в памяти), но также определяет десятки членов, которые позволяют визуализировать текст, изображения (пиктограммы, битовые карты и т.п.), и многочисленные геометрические шаблоны. В табл.3 приведен неполный список членов этого класса.

Таблица 3. Члены класса Graphics

Метод Назначение
FromHdc() FromHwnd() FromImage() Эти статические методы предоставляют возможность получения корректного объекта Graphics от заданного изображения (пиктограммы, битовой карты и т.п.) или виджета GUI.
Clear() Этот метод заполняет объект Graphics указанным цветом, стирая в процессе текущую поверхность рисования.
DrawArc() DrawBeziers() DrawCurve() DrawEllipse() DrawIcon() DrawLine() DrawLines() DrawPie() DrawPath() DrawRectangle() DrawRectangles() DrawString() Эти методы используются для визуализации заданного образа или геометрического шаблона. Все методы Draw XXX () требуют использования объектов GDI+ Pen.
FillEllipse() FillPie() FillPolygon() FillRectangle() FillPath() Эти методы используются для заполнения внутренности заданной геометрической фигуры. Все методы Fill XXX () требуют применения объектов GDI+ Brush.

Кроме представленного множества методов для визуализации, класс Graphics определяет дополнительные члены, позволяющие конфигурировать “состояние” объекта Graphics. Присваивая значения свойствам, перечисленным в табл. 4, можно изменять текущие операции визуализации.

Замечание. Что касается ASP.NET, то System.Drawing предоставляет тип BufferedGraphics, который позволяет визуализировать графику с использованием системы двойной буферизации

для минимизации или исключения мерцания, которое может возникнуть во время операций визуализации. Подробности можно найти в документации по. NET Framework 2.0 SDK.

Таблица 3.4. Свойства состояния класса Graphics

Свойства Назначение
Clip ClipBounds VisibleClipBounds IsClipEmpty IsVisibleClipEmpty Эти свойства позволяют устанавливать опции отсечения, используемые с текущим объектом Graphics.
Transform Это свойство позволяет трансформировать “мировые координаты” (подробнее об этом речь пойдет ниже).
PageUnit PageScale DpiX DpiY Эти свойства позволяют конфигурировать точку начала координат операций визуализации, а также единицу измерения.
SmoothingMode PixelOffsetMode TextRenderingHint Эти свойства позволяют конфигурировать гладкость геометрических объектов и текста.
CompositingMode CompositingQuality Свойство CompositingMode определяет, будет ли рисование перекрывать фон или смешиваться с ним.
InterpolationMode Это свойство специфицирует интерполяцию данных между конечными точками.

Вопреки предположениям, класс Graphics невозможно создать через ключевое слово new, поскольку в нем нет общедоступно объявленных конструкторов. Как же тогда получить действительный объект Graphics? Давайте посмотрим.

Сеансы Paint

Наиболее распространенный способ получения объекта Graphics состоит в обработке события Paint. Вспомните из предыдущей главы, что класс Control определяет виртуальный метод по имени OnPaint (). Когда вы хотите, чтобы Form визуализировал графические данные на своей поверхности, можете переопределить этот метод и извлечь объект Graphics из входного параметра PaintEventArgs. Для иллюстрации создайте новое приложение Windows Forms по имени BasicPaintForm и обновите класс-наследник Form следующим образом:

public partial class MainForm: Form

{

public MainForm()

{

InitializeComponent();

CenterToScreen();

this.Text = "Basic Paint Form";

}

protected override void OnPaint(PaintEventArgs e)

{

// Переопределяя OnPaint(), не забудьте вызвать реализацию базового класса.

base.OnPaint(e);

// Получить объект Graphics из входящего PaintEventArgs.

Graphics g = e.Graphics;

// Визуализировать текстовое сообщение в заданном шрифте и цвете.

g.DrawString("Hello GDI+", new Font("Times New Roman", 20), Brushes.Green, 0, 0);

}

}

Хотя переопределение OnPaint () допустимо, более распространенный способ обработки события Paint предусматривает использование ассоциированного делегата PaintEventHandler (фактически это поведение по умолчанию, принятое в Visual Studio при обработке событий через окно Properties). Этот делегат может указывать на любой метод, принимающий в первом параметре System.Object, а во втором — PaintEventArgs. Если имеется обработанное событие Paint (через дизайнер Visual Studio, или вручную в коде), то можно извлечь объект Graphics из входящего параметра PaintEventArgs. Вот необходимое изменение:

public partial class MainForm: Form

{

public MainForm()

{

InitializeComponent();

CenterToScreen();

this.Text = "Basic Paint Form";

// Visual Studio помещает этот код внутрь InitializeComponent().

this.Paint += new PaintEventHandler(MainForm_Paint);

}

private void MainForm_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

g.DrawString("Hello GDI+", new Font("Times New Roman", 20),

Brushes.Green, 0, 0);

}

}

Независимо от того, как вы реагируете на событие Paint, имейте в виду, что всякий раз, когда окно становится “грязным”, инициируется событие Paint. И как вам должно быть известно, окно считается “грязным” всякий раз, когда изменяется его размер, оно перекрывается другим окном (полностью или частично) и потом открывается, либо сворачивается и затем восстанавливается. Во всех этих случаях. NET гарантирует, что если форма нуждается в перерисовке, обработчик события Paint (или переопределенный метод OnPaint ()) вызывается автоматически.





Дата публикования: 2015-11-01; Прочитано: 636 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.011 с)...