Grafika 2D
WPF vs Windows Forms
WPF vs Windows Forms
immediate-mode graphics :immediate-mode graphics :
programista dba o odrysowywanie
programista dba o odrysowywanie
elementów, które tego wymagają
elementów, które tego wymagają
retained-mode graphics :
retained-mode graphics :
wszystko co zostanie narysowane jest
wszystko co zostanie narysowane jest
automatycznie zachowywane i odświeżane
Trzy sposoby
Trzy sposoby
● DrawingDrawing
● VisualVisual
Drawing
Drawing
● GeometryDrawingGeometryDrawing ● ImageDrawingImageDrawing ● VideoDrawingVideoDrawing ● GlyphRunDrawingGlyphRunDrawing ● DrawingGroupDrawingGroupGeometryDrawing
GeometryDrawing
<GeometryDrawing<GeometryDrawing BrushBrush = "Orange"> = "Orange"> <GeometryDrawing.
<GeometryDrawing.PenPen>>
<Pen Brush = "Black" Thickness = "10"/>
<Pen Brush = "Black" Thickness = "10"/>
</GeometryDrawing.Pen>
</GeometryDrawing.Pen>
<GeometryDrawing.
<GeometryDrawing.GeometryGeometry>> <EllipseGeometry
<EllipseGeometry RadiusX = "100" RadiusX = "100"
RadiusY = "50"/> RadiusY = "50"/> </GeometryDrawing.Geometry> </GeometryDrawing.Geometry> </GeometryDrawing> </GeometryDrawing>
Wyświetlanie Drawing
Wyświetlanie Drawing
● DrawingImageDrawingImage
● DrawingBrushDrawingBrush
GeometryDrawing
GeometryDrawing
<Image> <Image> <Image.Source> <Image.Source> <DrawingImage> <DrawingImage> <DrawingImage.Drawing> <DrawingImage.Drawing> <GeometryDrawing Brush=”Orange”> <GeometryDrawing Brush=”Orange”> . . . . . . </GeometryDrawing> </GeometryDrawing> </DrawingImage.Drawing> </DrawingImage.Drawing> </DrawingImage> </DrawingImage> </Image.Source> </Image.Source> </Image> </Image>Geometry
Geometry
● RectangleGeometryRectangleGeometry
( Rect, RadiusX, RadiusY ) ( Rect, RadiusX, RadiusY )
● EllipseGeometryEllipseGeometry
( Center, RadiusX, RadiusY ) ( Center, RadiusX, RadiusY )
● LineGeometryLineGeometry
( StartPoint, EndPoint ) ( StartPoint, EndPoint )
PathGeometry.Figures
PathGeometry.Figures
(PathFigure)
(PathFigure)
● LineSegmentLineSegment ● PolyLineSegmentPolyLineSegment ● ArcSegmentArcSegment ● BezierSegmentBezierSegment ● PolyBezierSegmentPolyBezierSegment ● QuadraticBezierSegmentQuadraticBezierSegment ● PolyQuadraticBezierSegmentPolyQuadraticBezierSegmentPathFigure
PathFigure
<GeometryDrawing> <GeometryDrawing> <GeometryDrawing.Pen> <GeometryDrawing.Pen><Pen Brush = "Black" Thickness = "10" />
<Pen Brush = "Black" Thickness = "10" />
</GeometryDrawing.Pen> </GeometryDrawing.Pen> <GeometryDrawing.Geometry> <GeometryDrawing.Geometry> <PathGeometry> <PathGeometry> <
<PathFigure PathFigure StartPoint = "0, 0"StartPoint = "0, 0">>
<LineSegment Point = "0, 100" /> <LineSegment Point = "0, 100" /> <LineSegment Point = "100, 100" /> <LineSegment Point = "100, 100" /> </PathFigure> </PathFigure> . . . . . .
PathFigure
PathFigure
● StartPointStartPoint ● IsClosedIsClosed ● FillRuleFillRule ● EvenOddEvenOdd ● NonZeroNonZeroGeometryGroup
GeometryGroup
<GeometryDrawing ... > <GeometryDrawing ... > <GeometryDrawing.Geometry> <GeometryDrawing.Geometry> < <GeometryGroupGeometryGroup>> <PathGeometry> <PathGeometry> ... ... </PathGeometry> </PathGeometry> <RectangleGeometry ... /> <RectangleGeometry ... /> <EllipseGeometry ... /> <EllipseGeometry ... /> </GeometryGroup> </GeometryGroup> ... ...CombinedGeometry
CombinedGeometry
● GeometryCombineModeGeometryCombineMode ● UnionUnion ● IntersectIntersect ● XorXor ● ExcludeExclude ● Geometry1Geometry1 ● Geometry2Geometry2GeometryConverter
GeometryConverter
<GeometryDrawing <GeometryDrawing Geometry = "M 0,0 L 0,100 L 100,100 Z"> Geometry = "M 0,0 L 0,100 L 100,100 Z"> <GeometryDrawing.Pen> <GeometryDrawing.Pen><Pen Brush = "Black" Thickness = "10" />
<Pen Brush = "Black" Thickness = "10" />
</GeometryDrawing.Pen>
</GeometryDrawing.Pen>
</GeometryDrawing>
Pen
Pen
● StartLineCap, EndLineCap, DashCapStartLineCap, EndLineCap, DashCap
( Flat, Square, Round, Triangle ) ( Flat, Square, Round, Triangle )
● LineJoinLineJoin
( Miter, Round, Bevel ) ( Miter, Round, Bevel )
● DashStyleDashStyle
( Solid, Dash, Dot, DashDot, DashDotDot ) ( Solid, Dash, Dot, DashDot, DashDotDot )
DrawingVisual
DrawingVisual
DrawingGroup someDrawing = DrawingGroup someDrawing = FindResource ("someDrawing") FindResource ("someDrawing") as DrawingGroup; as DrawingGroup;DrawingVisual someVisual = new DrawingVisual ( );
DrawingVisual someVisual = new DrawingVisual ( );
using (DrawingContext dc = using (DrawingContext dc = someVisual.RenderOpen ( )) someVisual.RenderOpen ( )) { { dc.DrawDrawing (someDrawing); dc.DrawDrawing (someDrawing); } }
DrawingVisual c.d.
DrawingVisual c.d.
using (DrawingContext dc = using (DrawingContext dc = someVisual.RenderOpen ( )) someVisual.RenderOpen ( )) { { dc.DrawDrawing (firstDrawing); dc.DrawDrawing (firstDrawing); dc.DrawDrawing (secondDrawing); dc.DrawDrawing (secondDrawing);dc.DrawGeometry ( Brushes.Blue, null,
dc.DrawGeometry ( Brushes.Blue, null,
Geometry.Parse Geometry.Parse ( ... ) ); ( ... ) ); dc.DrawEllipse ( ... ); dc.DrawEllipse ( ... ); dc.DrawLine ( ... ); dc.DrawLine ( ... ); } }
Wyświetlanie DrawingVisual
Wyświetlanie DrawingVisual
AddVisualChild(someVisual); AddVisualChild(someVisual); AddLogicalChild(someVisual); AddLogicalChild(someVisual); } }protected override int VisualChildrenCount
protected override int VisualChildrenCount
{ get { return 1; } }
{ get { return 1; } }
protected override Visual GetVisualChild (int index)
protected override Visual GetVisualChild (int index)
{ { return someVisual; return someVisual; } }
Visual Hit Testing
Visual Hit Testing
HitTestResult result =HitTestResult result =
VisualTreeHelper.HitTest (this, point);
VisualTreeHelper.HitTest (this, point);
if (result.VisualHit == someVisual)
if (result.VisualHit == someVisual)
{
{
// Nasz obiekt someVisual zawiera punkt "point"
// Nasz obiekt someVisual zawiera punkt "point"
}
Visual Hit Testing c.d.
Visual Hit Testing c.d.
VisualTreeHelper.HitTest(this, null,VisualTreeHelper.HitTest(this, null,
new HitTestResultCallback (HitCbk),
new HitTestResultCallback (HitCbk),
new PointHitTestParameters (point));
new PointHitTestParameters (point));
}
}
public HitTestResultBehavior HitCbk(HitTestResult r)
public HitTestResultBehavior HitCbk(HitTestResult r)
{
{
DrawingVisual dv = r.VisualHit as DrawingVisual;
DrawingVisual dv = r.VisualHit as DrawingVisual;
...
... // dv zawiera "trafiony" obiekt DrawingVisual// dv zawiera "trafiony" obiekt DrawingVisual return HitTestResultBehavior.Continue;
return HitTestResultBehavior.Continue;
}
Shape
Shape
● RectangleRectangle ● EllipseEllipse ● LineLine ● PolylinePolyline ● PolygonPolygon ● PathPathShape c.d.
Shape c.d.
<StackPanel><StackPanel>
<
<RectangleRectangle Width = "200" Height = "100" Width = "200" Height = "100" Fill = "Orange" Stroke = "Black"
Fill = "Orange" Stroke = "Black"
StrokeThickness = "10" Margin = "4"
StrokeThickness = "10" Margin = "4"
RadiusX = "10" RadiusY = "30" />
RadiusX = "10" RadiusY = "30" />
<
<EllipseEllipse Width="20" Height="10" Fill="Orange"/> Width="20" Height="10" Fill="Orange"/>
< <LineLine X1 = "0" Y1 = "0" X2 = "10" Y2 = "10" X1 = "0" Y1 = "0" X2 = "10" Y2 = "10" Stroke = "Red" /> Stroke = "Red" /> </StackPanel> </StackPanel>
Shape c.d.
Shape c.d.
<StackPanel><StackPanel>
<
<PolylinePolyline Points = "0, 0 100, 100 200, 0" Points = "0, 0 100, 100 200, 0" Stroke = "Black" />
Stroke = "Black" />
<
<PolygonPolygon Points = "0, 0 100, 100 200, 0" Points = "0, 0 100, 100 200, 0" Stroke = "Black" />
Stroke = "Black" />
</StackPanel>
Shape c.d.
Shape c.d.
<StackPanel><StackPanel>
<
<PathPath Fill = "Orange" Stroke = "Black"> Fill = "Orange" Stroke = "Black"> <Path.Data>
<Path.Data>
<PathGeometry>
<PathGeometry>
<PathFigure IsClosed = "True">
<PathFigure IsClosed = "True">
<LineSegment Point = "0,100" /> <LineSegment Point = "0,100" /> <LineSegment Point = "100,100" /> <LineSegment Point = "100,100" /> </PathFigure> </PathFigure> . . . . . .
Brush
Brush
● SolidColorBrushSolidColorBrush ● LinearGradientBrushLinearGradientBrush ● RadialGradientBrushRadialGradientBrush ● DrawingBrushDrawingBrush ● ImageBrushImageBrush ● VisualBrushVisualBrush ● BitmapCacheBrushBitmapCacheBrushLinearGradientBrush
LinearGradientBrush
<LinearGradientBrush<LinearGradientBrush StartPoint = "0,0" StartPoint = "0,0" EndPoint = "1,1">
EndPoint = "1,1">
<GradientStop Offset = "0" Color = "Red"/>
<GradientStop Offset = "0" Color = "Red"/>
<GradientStop Offset = "0.2" Color = "Orange"/>
<GradientStop Offset = "0.2" Color = "Orange"/>
<GradientStop Offset = "0.4" Color = "Yellow"/>
<GradientStop Offset = "0.4" Color = "Yellow"/>
<GradientStop Offset = "0.6" Color = "Green"/>
<GradientStop Offset = "0.6" Color = "Green"/>
<GradientStop Offset = "0.8" Color = "Blue"/>
<GradientStop Offset = "0.8" Color = "Blue"/>
<GradientStop Offset = "1" Color = "Purple"/>
<GradientStop Offset = "1" Color = "Purple"/>
</LinearGradientBrush>
RadialGradientBrush
RadialGradientBrush
<RadialGradientBrush
<RadialGradientBrush Center = "0.5,0.5" Center = "0.5,0.5"
RadiusX = "0.5" RadiusY = "0.5">
RadiusX = "0.5" RadiusY = "0.5">
<GradientStop Offset = "0" Color="#990000FF"/>
<GradientStop Offset = "0" Color="#990000FF"/>
<GradientStop Offset="0.5" Color="#550000FF"/>
<GradientStop Offset="0.5" Color="#550000FF"/>
<GradientStop Offset = "1" Color="#000000FF"/>
<GradientStop Offset = "1" Color="#000000FF"/>
</RadialGradientBrush>
TileBrush
TileBrush
● DrawingBrushDrawingBrush
● ImageBrushImageBrush
TileBrush
TileBrush
● Stretch (None, Fill, Uniform, UniformToFill)Stretch (None, Fill, Uniform, UniformToFill)
● TileMode (None, Tile, FlipXY, FlipX, FlipY)TileMode (None, Tile, FlipXY, FlipX, FlipY)
● ViewportViewport
Effect
Effect
● DropShadowEffectDropShadowEffect
● BlurEffectBlurEffect