21
Классы двумерной графики WPF System.Object DispatcherObj ect DependencyObj ect Visual UIElement FrameworkElem ent Shape Ellipse Line Path Polygon Polylin e Rectang le Image ContainerVi sual DrawingVisu al Freezable Animatable Brush GradientBrush LineGradientBru sh RadialGradientB rush SolidColorBru sh TileBrush DrawingBrus h ImageBrush VisualBrush Pen Geometry CombinedGeometr y EllipseGeometry GeometryGroup LineGeometry PathGeometry RectangleGeomet ry StreamGeometry ImageSourc e DrawingIma ge BitmapSour ce BitmapFrame BitmapImage CroppedBitm ap PathSegmen t ArcSegment BezierSegment LineSegment PolyBezierSegment PolyLineSegment PolyQuadraticBezierS egment QuadraticBezierSegme nt PathFigu re Drawing DrawingGroup ImageDrawing GeometryDrawi ng DrawingConte xt

Классы двумерной графики WPF

  • Upload
    adsila

  • View
    127

  • Download
    0

Embed Size (px)

DESCRIPTION

Классы двумерной графики WPF. Графическая система WPF . Графическая система приложений на основе GDI или GDI+ использует режим интерпретации – за обновление(перерисовку) отвечает приложение. Графическая система WPF использует сохраненный режим : - PowerPoint PPT Presentation

Citation preview

Page 1: Классы двумерной графики  WPF

Классы двумерной графики WPF

System.Object

DispatcherObject

DependencyObject

Visual

UIElement

FrameworkElement

Shape

Ellipse

Line

Path

Polygon

Polyline

Rectangle

Image

ContainerVisual

DrawingVisual

Freezable

Animatable

Brush

GradientBrush

LineGradientBrush

RadialGradientBrush

SolidColorBrush

TileBrush

DrawingBrush

ImageBrush

VisualBrush

Pen Geometry

CombinedGeometry

EllipseGeometry

GeometryGroup

LineGeometry

PathGeometry

RectangleGeometry

StreamGeometry

ImageSource

DrawingImage

BitmapSource

BitmapFrame

BitmapImage

CroppedBitmap

PathSegment

ArcSegment

BezierSegment

LineSegment

PolyBezierSegment

PolyLineSegment

PolyQuadraticBezierSegment

QuadraticBezierSegment

PathFigure Drawing

DrawingGroup

ImageDrawing

GeometryDrawing

DrawingContext

Page 2: Классы двумерной графики  WPF

Графическая система WPF

Графическая система приложений на основе GDI или GDI+ использует режим интерпретации – за обновление(перерисовку) отвечает приложение.

Графическая система WPF использует сохраненный режим:

• объекты приложения, имеющие визуальное представление, определяют набор сериализованных графических данных;

• после определения графических данных за перерисовку объектов приложения отвечает система.

В WPF для всех элементов реализована композитная система рендеринга. Операции рисования выполняются с самого нижнего ( минимальное значение z-индекса) элемента. Более близкие к наблюдателю элементы перекрывают выведенные ранее.

Page 3: Классы двумерной графики  WPF

Единицы измерения WPF

WPF использует аппаратно-независимую единицу 1/96 дюйма (логический пиксель).

Если стандартный параметр системы DPI равен 96 dpi, аппаратно-независимая единица соответствует одному физическому пикселю, так как

размер физической единицы = размер аппаратно-независимой единицы x DPI системы

Если установить в системе другое значение DPI, например, 120 (крупный шрифт), размер физической единицы будет равен 1/96*120 = 1.25 (пикселей). Размер всех элементов управления, текста, любых изображений увеличится.

Пункт(point) 1/72 дюйма.

Технология совмещения с пикселями - pixel snapping

Page 4: Классы двумерной графики  WPF

Классы Shape и Geometry

Классы, производные от абстрактного базового класса System.Windows.Media.Geometry, определяют геометрические фигуры. Класс Geometry определяет только геометрию фигуры ( координаты и размер), и сам себя отображать не может.

Классы, производные от System.Windows.Shapes.Shape,• поддерживают события, как и другие элементы управления;• участвуют в системе макета, их можно разместить в любой контейнер компоновки;• автоматически перерисовываются при изменении размера, перемещении или

изменении свойств. Класс Shape содержит ссылку на объект Geometry:

public virtual Geometry RenderedGeometry { get; }

Свойство Data класса Path (производный от Shape) возвращает или задает объект Geometry, определяющий фигуру для рисования:

public Geometry Data { get; set; }

Page 5: Классы двумерной графики  WPF

Фигуры(shape)

Некоторые свойства, определенные в классе Shape:

Visual

UIElemrnt

FrameworkElement

Shape

Ellipse

Line

Path

Polyline

Polygon

Rectangle

Image

public Brush Fill { get; set; } Объект Brush для внутренней части фигуры. Умолчание null.

public Brush Stroke { get; set; } Объект Brush для контура фигуры. Умолчание null.

public double StrokeThickness { get; set; }

Толщина контура.

public Stretch Stretch { get; set; } Способ заполнения выделенного для фигуры пространства. Перечисление Stretch имеет значения None, Fill, Uniform, UniformToFill.

Page 6: Классы двумерной графики  WPF

System.Windows.Shapes.Line Элемент управления, представляющий собой отрезок прямой, соединяющий две точки. Свойства класса Line, которые задают отрезок прямой. Координаты задаются

относительно левого верхнего угла контейнера размещения без полей.public double X1 { get; set; } public double Y1 { get; set; }

public double X2 { get; set; } public double Y2 { get; set; }

Пример в коде C#.

Пример определения в разметке <Grid Grid.Column="1" Background="WhiteSmoke"> <Line Name="line_right" Margin ="10,10,10,10“ X1="0" Y1="0" X2="100" Y2="100" Stroke="SlateBlue" StrokeThickness="2"> </Line> </Grid>

public partial class Page_Lines : Page { Line line_left = new Line(); private void Page_Loaded(object sender, RoutedEventArgs e) { line_left.X1 = 10; line_left.Y1 = 10; line_left.X2 = 100; line_left.Y2 = 150; line_left.Stroke = new SolidColorBrush(Colors.Red); line_left.StrokeThickness = 1;

if (grid1.Children.Contains(line_left) == false) grid1.Children.Add(line_left);

} …………

Page 7: Классы двумерной графики  WPF

System.Windows.Shapes.Polyline Элемент управления, представляющий собой линию, состоящую из отрезков прямой. Класс содержит коллекцию, состоящую из вершин Polyline.

public PointCollection Points { get; set; }

Коллекция PointCollection

[TypeConverterAttribute(typeof(PointCollectionConverter))] public sealed class PointCollection : Freezable, IFormattable, IList, ICollection, IList<Point>, ICollection<Point>, IEnumerable<Point>, IEnumerable

При объявлении коллекции PointCollection в разметке можно использовать обычный синтаксис для коллекций или задать в виде строки, в которой координаты вершин разделены одной запятой и (или) одним или несколькими пробелами.

Пример объявления в разметке

< Grid Grid.Column="1" Background="WhiteSmoke"> <Polyline Name="polyline_1" Margin ="10,10,10,10" Points="10,10,50,100,100,100,150,10,200,150,250,0" Stroke="SlateBlue" StrokeThickness="1"></Polyline> <Polyline Name="polyline_2" Margin ="10,10,10,10" Points="10,30 50,120 100,120 150,30 200,170 250,20" Stroke="Red" StrokeThickness="1"></Polyline> </Grid>

Page 8: Классы двумерной графики  WPF

Классы Path, Geometry и PathGeometrySystem.Object

DispatcherObject

DependencyObject

Freezable

Animatable

Geometry

CombinedGeometry

EllipseGeometry

GeometryGroup

LineGeometry

PathGeometry

RectangleGeometry

StreamGeometry

PathSegment

ArcSegment

BezierSegment

LineSegment

PolyBezierSegment

PolyLineSegment

PolyQuadraticBezierSegment

QuadraticBezierSegment

PathFigure

Каждый объект PathFigure содержит коллекцию объектов PathSegment, (ArcSegment, BezierSegment , …), доступную через свойство Segments:

public PathFigureCollection Figures { get; set; }

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

Каждый объект PathGeometry содержит коллекцию объектов PathFigure, доступную через свойство Figures:

public PathSegmentCollection Segments { get; set; }

Объект PathGeometry можно отобразить с помощью элемента Path:

В классе Path есть свойствоpublic Geometry Data { get; set; }

Page 9: Классы двумерной графики  WPF

Класс Geometry Объекты Geometry поддерживают отсечение и проверку нажатия. Следующие методы класса проверяют, содержит ли вызывающий объект Geometry

заданный объект.

public bool FillContains( Geometry geometry );

Проверяет, содержит ли вызывающий объект Geometry заданный объект Geometry (целиком).

public bool FillContains( Point hitPoint );

Проверяет, содержит ли вызывающий объект Geometry заданный объект Point.

public bool FillContains( Geometry geometry, double tolerance, ToleranceType type );

Проверяет, содержит ли вызывающий объект Geometry заданный объект Geometry с учетом заданного предела погрешности.

public bool FillContains( Point hitPoint, double tolerance, ToleranceType type );

Проверяет, содержит ли вызывающий объект Geometry заданный объект Point с учетом заданного предела погрешности.

public static Geometry Parse( string source );

В классе определен метод Parse который позволяет задать геометрию в виде строки.

При заполнении области PathGeometry ко всем объектам PathFigure, свойство IsFilled которых имеет значение true, применяется правило FillRule.

Page 10: Классы двумерной графики  WPF

Создание составных фигур Геометрии можно комбинировать с помощью

• класса GeometryGroup,, который создает составную геометрию из любого числа объектов Geometry;

• класса CombinedGeometry, который создает составную геометрию из двух объектов Geometry и при объединении использует заданную двоичную операцию;

• статического метода Combine класса Geometry (дублирует возможности класса CombinedGeometry).

static PathGeometry Combine ( Geometry geometryA, Geometry geometryB,

GeometryCombineMode mode, Transform transform );

Перечисление GeometryCombineMode имеет значения

Union объединение

Intersect пересечение

Xor (A-B) + (B-A)

Exclude A-B

Page 11: Классы двумерной графики  WPF

Класс Transform Transform – абстрактный базовый класс для

преобразований в двухмерной плоскости.

TranslateTransform Перенос.

RotateTransform Поворот.

ScaleTransform Масштабирование.

SkewTransform Отклонение.

MatrixTransform Пользовательские преобразования.

TransformGroup Объединение нескольких объектов Transform в составной объект.

System.Object

DispatcherObject

DependencyObject

Freezable

Animatable

GeneralTransform

Transform

MatrixTransform

RotateTransform

ScaleTransform

SkewTransform

TransformGroup

TranslateTransform

GeneralTransformGroup

В производных от Transform классах определены свойства, с помощью которых можно задать параметры конкретных преобразований.

В классе TransformGroup определена коллекция объектов Transform

public TransformCollection Children { get; set; }

Page 12: Классы двумерной графики  WPF

Структура System.Windows.Media.Matrix Представляет матрицу 3x3 аффинного преобразования в двухмерном пространстве. Элементы матриц можно задать с помощью свойств типа double

M11 M12 0

M21 M22 0

OffsetX OffsetY 1

В типе Matrix определен конструктор

public Point Transform ( Point point );

public void Transform ( Point[] points );

public Vector Transform ( Vector vector );

public void Transform ( Vector[] vectors );

Методы Transform, определенные в Matrix, преобразуют заданную точку, массив точек, вектор или массив векторов с использованием вызывающей структуры Matrix.

System.Windows.Vector – структура с двумя полями типа double, которые доступны через свойства X и Y. Представляет смещение в двумерном пространстве.

public Matrix ( double m11, double m12, double m21, double m22, double offsetX, double offsetY );

и метод Parse , который преобразует строку (шесть значений double, разделенных запятыми) в объект Matrix.

public static Matrix Parse( string source );

Page 13: Классы двумерной графики  WPF

Операции с Matrix

public static Matrix Multiply( Matrix trans1, Matrix trans2 );

Умножение матриц.

public void Append( Matrix matrix ); Умножение исходной матрицы на заданную матрицу справа.

public void Prepend( Matrix matrix ); Умножение исходной матрицы на заданную матрицу слева.

public void SetIdentity(); Преобразование исходной матрицы в единичную матрицу.

public bool HasInverse { get; } Проверка, что матрица является обратимой.

public void Invert(); Замена исходной матрицы на обратную.

В типе Matrix определены методы преобразований, которые можно свести к умножению исходной (вызывающей) матрицы на матрицу специального вида. Так как умножение матриц некоммутативно, для каждого типа преобразований определены два метода – для умножения заданной матрицы на исходную матрицу слева и справа. Методы, в которых первым выполняется новое преобразование, имеют в своем названии корень Prepend.

Page 14: Классы двумерной графики  WPF

Перенос, поворот и масштабирование в Matrix

public void Translate ( double offsetX, double offsetY );

Перенос Matrix на заданное смещение.

public void Rotate( double angle ); Поворот Matrix на заданный (в градусах) угол вокруг начала координат.

public void RotateAt ( double angle, double centerX, double centerY );

Поворот Matrix на заданный (в градусах) угол вокруг заданной точки.

public void Scale( double scaleX, double scaleY ); Масштабирование Matrix на заданную величину.

public void ScaleAt( double scaleX, double scaleY, double centerX, double centerY );

Масштабирование Matrix на заданную величину относительно заданной точки.

public void Skew ( double skewX, double skewY ); Прибавляет отклонение на заданное значение по осям X и Y в конец данной структуры Matrix.

В приведенных ниже методах первым выполняется преобразование, которое определяется вызывающим объектом Matrix.

В типе Matrix также определены методы TranslatePrepend, RotatePrepend, RotateAtPrepend, ScalePrepend, ScaleAtPrepend, SkewPrepend с такими же параметрами, как и методы без корня Prepend. В этих методах первым выполняется преобразование, которое определяется значениями параметров.

Page 15: Классы двумерной графики  WPF

Некоторые свойства и методы класса Transform

public static Transform Identity { get; }

Возвращает единичное преобразование.

public abstract Matrix Value { get; }

Возвращает текущее преобразование как объект Matrix.

public static Transform Parse( string source );

Создает новый объект Transform из матрицы преобразования, заданной в текстовом виде ( шесть значений double, разделенных запятыми).

public Point Transform( Point point );

Выполняет преобразование для заданной точки. Бросает исключение, если преобразование завершилось неудачей.

public override bool TryTransform ( Point inPoint, out Point result ):

Выполняет преобразование для заданной точки и возвращает true, если преобразование выполнено успешно. В противном случае возвращает false и не бросает исключение.

public override Rect TransformBounds ( Rect rect );

Выполняет преобразование заданного прямоугольника и возвращает наименьший ограничивающий прямоугольник, содержащий преобразованный объект rect.

Page 16: Классы двумерной графики  WPF

Классы DrawingVisual и GeometryDrawingSystem.Object

DispatcherObject

DependencyObject

Visual

UIElement

FrameworkElement

Shape

Ellipse

Line

Path

Polygon

Polyline

Rectangle

Image

ContainerVisual

DrawingVisual

Freezable

Animatable

ImageSource

DrawingImage

BitmapSource

BitmapFrame

BitmapImage

CroppedBitmap

Drawing

DrawingGroup

ImageDrawing

GeometryDrawing

GlypgRunDrawing

VideoDrawing

DrawingContext

DrawingVisual — это визуальный объект, который можно использовать для отрисовки векторной графики на экране. Содержимое объекта сохраняется системой.

Класс не поддерживает разметку и обработку событий, что повышает его производительность.

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

Объекты Drawing не поддерживают cистему макета, ввод и фокус, что улучшает их производительность.

Page 17: Классы двумерной графики  WPF

Класс Visual Объект Visual является ядром объекта WPF. Объект Visual обеспечивает :

• отрисовку сохраненного, сериализованного содержимого визуального объекта;• выполнение преобразований визуального объекта;• обеспечение поддержки отсечения области визуального объекта; • определение принадлежности заданной координаты (точки) или геометрии к области,

занимаемой визуальным объектом;• определение ограничивающего прямоугольника визуального объекта.

Объект Visual хранит данные визуализации в виде списка инструкций векторной графики в сериализованном формате.

Для оптимизации приложений с интенсивной графикой WPF предлагает модель визуального слоя, в которой каждый графический элемент определяется как объект Visual, а для отображения всех объектов Visual используется один элемент управления.

Page 18: Классы двумерной графики  WPF

Класс DrawingContext Класс DrawingContext служит для заполнения объектов Visual (или Drawing) визуальным

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

Нельзя создать экземпляр DrawingContext. Ссылку на объект DrawingContext можно получить как возвращаемое значение методов некоторых классов, например, метода RenderOpen класса DrawingVisual

В классе DrawingContext определены методы для команд рисования, например,

public DrawingContext RenderOpen();

public abstract void DrawEllipse( Brush brush, Pen pen, Point center, double radiusX, double radiusY );public void DrawText ( FormattedText formattedText, Point origin );public abstract void DrawGeometry( Brush brush, Pen pen, Geometry geometry );public abstract void DrawDrawing( Drawing drawing );

Для того, чтобы сохранить содержимое DrawingContext, надо вызвать метод Close.

public abstract void Close();

После вызова метода Close визуальный объект нельзя изменять, но можно применить трансформацию.

Page 19: Классы двумерной графики  WPF

Класс DrawingContext. Пример

В примере получена ссылка на DrawingContext для объекта DrawingVisual и в объект DrawingContext добавлен эллипс

DrawingVisual visual = new DrawingVisual(); DrawingContext dc = visual.RenderOpen();

Pen pen = new Pen(Brushes.Red, 2); dc.DrawEllipse(Brushes.Gainsboro, pen, clickedPoint, 40, 20); dc.Close();

Чтобы вывести объект DrawingVisual его надо добавить в визуальное дерево некоторого элемента. В примере объект добавлен в элемент canvas типа Canvas.

canvas.AddVisualChild(visual);

Page 20: Классы двумерной графики  WPF

Класс DrawingContext. Пример. Продолжение class DrawingCanvas : Canvas { private List<Visual> visuals = new List<Visual>();

protected override int VisualChildrenCount { get { return visuals.Count; } }

protected override Visual GetVisualChild(int index) { return visuals[index];} public void AddVisual(Visual visual) { visuals.Add(visual); base.AddVisualChild(visual); base.AddLogicalChild(visual); } public void RemoveVisual(Visual visual) { visuals.Remove(visual); base.RemoveVisualChild(visual); base.RemoveLogicalChild(visual); }

public DrawingVisual GetVisual(Point point) { HitTestResult res = VisualTreeHelper.HitTest(this, point); return res.VisualHit as DrawingVisual; } }

Page 21: Классы двумерной графики  WPF

Класс Freezable Класс Freezable поддерживает функции, которые улучшают работу приложения с

объектами, на изменение или копирование которых тратится много ресурсов. Класс, производный от Freezable,

• поддерживает состояния только для чтения (фиксированный) и для чтения/записи;• фиксированный объект Freezable безопасно использовать в нескольких потоках;• класс сообщает об изменениях, если изменяются значения вложенных свойств;• в классе есть методы, которые обеспечивают большую глубину клонирования. Нельзя зафиксировать объект Freezable, если • объект имеет анимированные или привязанные к данным свойства;• объект имеет свойства, значения которых установлены динамическим ресурсом;• объект содержит подобъекты Freezable, которые нельзя зафиксировать. Свойство IsFrozen класса Freezable проверяет, является ли объект фиксированным.

Если попытаться изменить зафиксированный объект Freezable, будет брошено исключение InvalidOperationException.

В примере вызывается метод Freeze, чтобы зафиксировать объект brush .

SolidColorBrush brush = new SolidColorBrush(Colors.SlateBlue);if (brush.CanFreeze) brush.Freeze();