220 likes | 758 Vues
Классы двумерной графики WPF. Графическая система WPF . Графическая система приложений на основе GDI или GDI+ использует режим интерпретации – за обновление(перерисовку) отвечает приложение. Графическая система WPF использует сохраненный режим :
E N D
Графическая система WPF • Графическая система приложений на основе GDI или GDI+ использует режим интерпретации – за обновление(перерисовку) отвечает приложение. • Графическая система WPF использует сохраненный режим: • объекты приложения, имеющие визуальное представление, определяют набор сериализованных графических данных; • после определения графических данных за перерисовку объектов приложения отвечает система. • В WPF для всех элементов реализована композитная система рендеринга. Операции рисования выполняются с самого нижнего ( минимальное значение z-индекса) элемента. Более близкие к наблюдателю элементы перекрывают выведенные ранее.
Единицы измерения WPF • WPF использует аппаратно-независимую единицу 1/96 дюйма (логический пиксель). • Если стандартный параметр системы DPI равен 96 dpi, аппаратно-независимая единица соответствует одному физическому пикселю, так как • размер физической единицы = размер аппаратно-независимой единицы x DPI системы • Если установить в системе другое значение DPI,например, 120 (крупный шрифт), размер физической единицы будет равен 1/96*120 = 1.25 (пикселей). Размер всех элементов управления, текста, любых изображений увеличится. • Пункт(point) 1/72 дюйма. • Технология совмещения с пикселями - pixel snapping
Классы 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; }
Фигуры(shape) • Некоторые свойства, определенные в классе Shape:
System.Windows.Shapes.Line • Элемент управления, представляющий собой отрезок прямой, соединяющий две точки. • Свойства класса Line, которые задают отрезок прямой. Координаты задаются относительно левого верхнего угла контейнера размещения без полей. • Пример определения в разметке <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> • Пример в коде C#. 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); } …………
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>
Классы Path, Geometry и PathGeometry • Класс PathGeometry представляет фигуру, которая может состоять из дуг, кривых, эллипсов, линий и прямоугольников. • Каждый объект PathGeometry содержит коллекцию объектов PathFigure, доступную через свойствоFigures: public PathFigureCollection Figures { get; set; } • Каждый объект PathFigure содержит коллекцию объектов PathSegment, (ArcSegment, BezierSegment, …), доступную через свойство Segments: public PathSegmentCollection Segments { get; set; } • Объект PathGeometry можно отобразить с помощью элемента Path: • В классе Pathесть свойство public Geometry Data { get; set; }
Класс Geometry • Объекты Geometry поддерживают отсечение и проверку нажатия. • Следующие методы класса проверяют, содержит ли вызывающий объект Geometryзаданный объект. • В классе определен метод Parse который позволяет задать геометрию в виде строки. public static Geometry Parse( string source ); • При заполнении области PathGeometry ко всем объектам PathFigure, свойство IsFilled которых имеет значение true, применяется правило FillRule. • Перечисление ToleranceTypeимеет значения Absolute и Relative. От значения параметра зависит тип допустимой погрешности - абсолютная или относительная.
Создание составных фигур • Геометрии можно комбинировать с помощью • класса GeometryGroup,, которыйсоздает составную геометрию из любого числа объектов Geometry; • класса CombinedGeometry, которыйсоздает составную геометрию из двух объектов Geometryи при объединении использует заданную двоичную операцию; • статического методаCombine класса Geometry(дублирует возможности класса CombinedGeometry). static PathGeometry Combine( Geometry geometryA, Geometry geometryB, GeometryCombineMode mode, Transform transform ); • Перечисление GeometryCombineModeимеет значения
Класс Transform • Transform – абстрактный базовый класс для преобразований в двухмерной плоскости. • В производных от Transformклассах определены свойства, с помощью которых можно задать параметры конкретных преобразований. • В классе TransformGroupопределена коллекция объектов Transform • public TransformCollection Children { get; set; }
Структура System.Windows.Media.Matrix • Представляет матрицу 3x3 аффинного преобразования в двухмерном пространстве. Элементы матриц можно задать с помощью свойств типа double • В типе Matrixопределен конструктор public Matrix( double m11, double m12,double m21, double m22,double offsetX, double offsetY ); и метод Parse , который преобразует строку (шесть значений double, разделенных запятыми) в объект Matrix. public static Matrix Parse( string source ); • Методы Transform, определенные в Matrix, преобразуют заданную точку, массив точек, вектор или массив векторов с использованием вызывающей структуры Matrix. • System.Windows.Vector – структура с двумя полями типа double, которые доступны через свойства X и Y. Представляет смещение в двумерном пространстве.
Операции с Matrix • В типе Matrixопределены методы преобразований, которые можно свести к умножению исходной (вызывающей) матрицы на матрицу специального вида. Так как умножение матриц некоммутативно, для каждого типа преобразований определены два метода – для умножения заданной матрицы на исходную матрицу слева и справа. Методы, в которых первым выполняется новое преобразование, имеют в своем названии корень Prepend.
Перенос, поворот и масштабирование в Matrix • В приведенных ниже методах первым выполняется преобразование, которое определяется вызывающим объектом Matrix. • В типе Matrixтакже определены методы TranslatePrepend, RotatePrepend,RotateAtPrepend,ScalePrepend, ScaleAtPrepend, SkewPrependс такими же параметрами, как и методы без корня Prepend. В этих методах первым выполняется преобразование, которое определяется значениями параметров.
Некоторые свойства и методы класса Transform
Классы DrawingVisual и GeometryDrawing • DrawingVisual— это визуальный объект, который можно использовать для отрисовки векторной графики на экране. Содержимое объекта сохраняется системой. • Класс не поддерживает разметку и обработку событий, что повышает его производительность. • Drawing — это упрощенные объекты, позволяющие добавлять геометрические фигуры, изображения, текст и мультимедийные данные в приложение. • Объекты Drawing не поддерживают cистему макета, ввод и фокус, что улучшает их производительность.
Класс Visual • Объект Visual является ядром объекта WPF. • Объект Visual обеспечивает : • отрисовку сохраненного, сериализованного содержимого визуального объекта; • выполнение преобразований визуального объекта; • обеспечение поддержки отсечения области визуального объекта; • определение принадлежности заданной координаты (точки) или геометрии к области, занимаемой визуальным объектом; • определение ограничивающего прямоугольника визуального объекта. • Объект Visual хранит данные визуализации в виде списка инструкций векторной графики в сериализованном формате. • Для оптимизации приложений с интенсивной графикой WPF предлагает модель визуального слоя, в которой каждый графический элемент определяется как объект Visual, а для отображения всех объектов Visualиспользуется один элементуправления.
Класс DrawingContext • Класс DrawingContext служит для заполнения объектов Visual (или Drawing) визуальным содержимым. DrawingContext хранит набор инструкций отрисовки, которые позднее использует графическая система. • Нельзя создать экземпляр DrawingContext. Ссылку на объект DrawingContext можно получить как возвращаемое значение методов некоторых классов, например, метода RenderOpenкласса DrawingVisual public DrawingContext RenderOpen(); • В классе DrawingContext определены методы для команд рисования, например, 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визуальный объект нельзя изменять, но можно применить трансформацию.
Класс 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);
Класс DrawingContext. Пример. Продолжение class DrawingCanvas : Canvas { private List<Visual> visuals = new List<Visual>(); protected override intVisualChildrenCount { 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; } }
Класс Freezable • Класс Freezable поддерживает функции, которые улучшают работу приложения с объектами, на изменение или копирование которых тратится много ресурсов. • Класс, производный от Freezable, • поддерживает состояния только для чтения (фиксированный) и для чтения/записи; • фиксированный объект Freezable безопасно использовать в нескольких потоках; • класс сообщает об изменениях, если изменяются значения вложенных свойств; • в классе есть методы, которые обеспечивают большую глубину клонирования. • Нельзя зафиксировать объект Freezable, если • объект имеет анимированные или привязанные к данным свойства; • объект имеет свойства, значения которых установлены динамическим ресурсом; • объект содержит подобъекты Freezable, которые нельзя зафиксировать. • Свойство IsFrozen класса Freezable проверяет, является ли объект фиксированным. Если попытаться изменить зафиксированный объект Freezable, будет брошено исключение InvalidOperationException. • В примере вызывается метод Freeze, чтобы зафиксировать объект brush . SolidColorBrush brush = new SolidColorBrush(Colors.SlateBlue); if (brush.CanFreeze) brush.Freeze();