1 / 21

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

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

adsila
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Графическая система WPF • Графическая система приложений на основе GDI или GDI+ использует режим интерпретации – за обновление(перерисовку) отвечает приложение. • Графическая система WPF использует сохраненный режим: • объекты приложения, имеющие визуальное представление, определяют набор сериализованных графических данных; • после определения графических данных за перерисовку объектов приложения отвечает система. • В WPF для всех элементов реализована композитная система рендеринга. Операции рисования выполняются с самого нижнего ( минимальное значение z-индекса) элемента. Более близкие к наблюдателю элементы перекрывают выведенные ранее.

  3. Единицы измерения WPF • WPF использует аппаратно-независимую единицу 1/96 дюйма (логический пиксель). • Если стандартный параметр системы DPI равен 96 dpi, аппаратно-независимая единица соответствует одному физическому пикселю, так как • размер физической единицы = размер аппаратно-независимой единицы x DPI системы • Если установить в системе другое значение DPI,например, 120 (крупный шрифт), размер физической единицы будет равен 1/96*120 = 1.25 (пикселей). Размер всех элементов управления, текста, любых изображений увеличится. • Пункт(point) 1/72 дюйма. • Технология совмещения с пикселями - pixel snapping

  4. Классы 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; }

  5. Фигуры(shape) • Некоторые свойства, определенные в классе Shape:

  6. 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); } …………

  7. 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>

  8. Классы 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; }

  9. Класс Geometry • Объекты Geometry поддерживают отсечение и проверку нажатия. • Следующие методы класса проверяют, содержит ли вызывающий объект Geometryзаданный объект. • В классе определен метод Parse который позволяет задать геометрию в виде строки. public static Geometry Parse( string source ); • При заполнении области PathGeometry ко всем объектам PathFigure, свойство IsFilled которых имеет значение true, применяется правило FillRule. • Перечисление ToleranceTypeимеет значения Absolute и Relative. От значения параметра зависит тип допустимой погрешности - абсолютная или относительная.

  10. Создание составных фигур • Геометрии можно комбинировать с помощью • класса GeometryGroup,, которыйсоздает составную геометрию из любого числа объектов Geometry; • класса CombinedGeometry, которыйсоздает составную геометрию из двух объектов Geometryи при объединении использует заданную двоичную операцию; • статического методаCombine класса Geometry(дублирует возможности класса CombinedGeometry). static PathGeometry Combine( Geometry geometryA, Geometry geometryB, GeometryCombineMode mode, Transform transform ); • Перечисление GeometryCombineModeимеет значения

  11. Класс Transform • Transform – абстрактный базовый класс для преобразований в двухмерной плоскости. • В производных от Transformклассах определены свойства, с помощью которых можно задать параметры конкретных преобразований. • В классе TransformGroupопределена коллекция объектов Transform • public TransformCollection Children { get; set; }

  12. Структура 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. Представляет смещение в двумерном пространстве.

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

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

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

  16. Классы DrawingVisual и GeometryDrawing • DrawingVisual— это визуальный объект, который можно использовать для отрисовки векторной графики на экране. Содержимое объекта сохраняется системой. • Класс не поддерживает разметку и обработку событий, что повышает его производительность. • Drawing — это упрощенные объекты, позволяющие добавлять геометрические фигуры, изображения, текст и мультимедийные данные в приложение. • Объекты Drawing не поддерживают cистему макета, ввод и фокус, что улучшает их производительность.

  17. Класс Visual • Объект Visual является ядром объекта WPF. • Объект Visual обеспечивает : • отрисовку сохраненного, сериализованного содержимого визуального объекта; • выполнение преобразований визуального объекта; • обеспечение поддержки отсечения области визуального объекта; • определение принадлежности заданной координаты (точки) или геометрии к области, занимаемой визуальным объектом; • определение ограничивающего прямоугольника визуального объекта. • Объект Visual хранит данные визуализации в виде списка инструкций векторной графики в сериализованном формате. • Для оптимизации приложений с интенсивной графикой WPF предлагает модель визуального слоя, в которой каждый графический элемент определяется как объект Visual, а для отображения всех объектов Visualиспользуется один элементуправления.

  18. Класс 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визуальный объект нельзя изменять, но можно применить трансформацию.

  19. Класс 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);

  20. Класс 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; } }

  21. Класс Freezable • Класс Freezable поддерживает функции, которые улучшают работу приложения с объектами, на изменение или копирование которых тратится много ресурсов. • Класс, производный от Freezable, • поддерживает состояния только для чтения (фиксированный) и для чтения/записи; • фиксированный объект Freezable безопасно использовать в нескольких потоках; • класс сообщает об изменениях, если изменяются значения вложенных свойств; • в классе есть методы, которые обеспечивают большую глубину клонирования. • Нельзя зафиксировать объект Freezable, если • объект имеет анимированные или привязанные к данным свойства; • объект имеет свойства, значения которых установлены динамическим ресурсом; • объект содержит подобъекты Freezable, которые нельзя зафиксировать. • Свойство IsFrozen класса Freezable проверяет, является ли объект фиксированным. Если попытаться изменить зафиксированный объект Freezable, будет брошено исключение InvalidOperationException. • В примере вызывается метод Freeze, чтобы зафиксировать объект brush . SolidColorBrush brush = new SolidColorBrush(Colors.SlateBlue); if (brush.CanFreeze) brush.Freeze();

More Related