MSDN Magazine - December 2008 - (Page 101) ChARles PeTzOlD Foundations Render Text On A Path With WPF Text is more than just its literal meaning. tion of segments. The first segment begins at Whether printed or displayed on a computthe StartPoint, and each successive segment er screen, the choice of font can enhance or continues where the last one left off. These detract from the impact of the text. Text can segments are all derivatives of the abstract be made inviting or forbidding, soothing or PathSegment class: LineSegment, PolyLineFigure 1 Text on a Curved Path stormy. Computer graphics can also release Segment, BezierSegment, PolyBezierSegtext from the confines of its customary line-by-line progression. ment, QuadraticBezierSegment, PolyQuadraticBezierSegment, By treating text characters as graphical objects, the programmer and ArcSegment. In other words, a PathFigure is a connected series can make text dance and fly on the screen. of straight lines, Bezier curves, quadratic Bezier curves, and arcs, One desirable technique is positioning text characters along a which are curves on the circumference of an ellipse. curved line, as shown in Figure 1. In graphics programming, a colA PathFigure has a geometric length. In the source code that lection of straight lines and curves is called a “path,” so this task is accompanies this column, I refer to this length with the variable sometimes described as “text on a path,” and that’s what I’ll tackle pathLength. If the PathFigure consists solely of LineSegment and in this column. PolyLineSegment objects, calculating the length is trivial: simply When programming for Windows Presentation Foundation use the Pythagorean Theorem to calculate the length of each line (WPF), a significant bonus accompanies the programming of text and accumulate them. But an ArcSegment requires more complex on a path: you can animate the individual points defining the path math, and calculating the length of a Bezier curve is a positively and watch the characters bounce around in response. frightening job. As usual in WPF, there is more than one way to do this job, and To simplify the calculation of the PathFigure length, it’s conveI’ll demonstrate several approaches. As is also common in WPF, nient to convert the path to a collection of polylines that approxithe difficult part of the job turns out to be something other than mate the curves. This is called flattening the path. It’s then easy to what might originally be assumed. In putting text on a path, the calculate the length with repeated application of the Pythagorean big problem really isn’t figuring out how to move and rotate the Theorem. WPF even makes knowledge of the Pythagorean Theotext characters. That’s relatively straightforward. The hard part is rem unnecessary: subtracting one point from another results in a properly informing the WPF layout system of the correct size of Vector object, and the Vector object contains a Length property the resultant graphic. that returns the length between the two points. The PathFigure class contains a method named GetFlattenedUniting Paths and Text PathFigure that returns another PathFigure containing only A graphics path is a collection of straight lines and curves. Some LineSegment and PolyLineSegment objects. And this is ideal for of these lines and curves might be connected to each other. Some calculating the length of the entire PathFigure. might form enclosed areas. In WPF, the graphics path is encapsulated A text string rendered with a particular font and font size also in both the PathGeometry and StreamGeometry classes. Stream- has a geometric size. If you use the popular TextBlock element to Geometry offers better performance, but the individual points that display text, the width of the displayed text is available from the define the path become fixed and cannot be animated. ActualWidth property. During the layout process prior to the acIn placing text on a path, it’s pretty much essential that the lines tual display, ActualWidth might not be set yet, but TextBlock will and curves comprising the path be connected end to end with each set its DesiredSize property to the size of the text. other. You probably don’t want to deal with a text string jumping TextBlock uses the FormattedText object for calculating the size of across a disconnection in the path. For this reason, the WPF class its text, and this class is also available to the application programmer. I’m really interested in is PathFigure, which is a single collection of connected straight lines and curves. A PathGeometry is a colSend your questions and comments to mmnet30@microsoft.com. lection of one or more PathFigure objects. Code download: code.msdn.microsoft.com/mag200812Foundations. The PathFigure itself defines a StartPoint and contains a collecDecember 2008 101 http://code.msdn.microsoft.com/mag200812Foundations
Table of Contents Feed for the Digital Edition of MSDN Magazine - December 2008 MSDN Magazine - December 2008 Contents Toolbox CLR Inside Out Advanced Basics Cutting Edge Patterns In Practice Team System Real-World WF Visual Studio OBA Tools SOA Data Access Geneva Framework Test Run Foundations Windows With C++ Going Places End Bracket MSDN Magazine - December 2008 MSDN Magazine - December 2008 - (Page Intro) MSDN Magazine - December 2008 - Contents (Page Cover1) MSDN Magazine - December 2008 - Contents (Page Cover2) MSDN Magazine - December 2008 - Contents (Page 1) MSDN Magazine - December 2008 - Contents (Page 2) MSDN Magazine - December 2008 - Contents (Page 3) MSDN Magazine - December 2008 - Contents (Page 4) MSDN Magazine - December 2008 - Contents (Page 5) MSDN Magazine - December 2008 - Contents (Page 6) MSDN Magazine - December 2008 - Contents (Page 7) MSDN Magazine - December 2008 - Contents (Page 8) MSDN Magazine - December 2008 - Contents (Page 9) MSDN Magazine - December 2008 - Contents (Page 10) MSDN Magazine - December 2008 - Toolbox (Page 11) MSDN Magazine - December 2008 - Toolbox (Page 12) MSDN Magazine - December 2008 - Toolbox (Page 13) MSDN Magazine - December 2008 - Toolbox (Page 14) MSDN Magazine - December 2008 - CLR Inside Out (Page 15) MSDN Magazine - December 2008 - CLR Inside Out (Page 16) MSDN Magazine - December 2008 - CLR Inside Out (Page 17) MSDN Magazine - December 2008 - CLR Inside Out (Page 18) MSDN Magazine - December 2008 - CLR Inside Out (Page 19) MSDN Magazine - December 2008 - CLR Inside Out (Page 20) MSDN Magazine - December 2008 - CLR Inside Out (Page 21) MSDN Magazine - December 2008 - Advanced Basics (Page 22) MSDN Magazine - December 2008 - Advanced Basics (Page 23) MSDN Magazine - December 2008 - Advanced Basics (Page 24) MSDN Magazine - December 2008 - Advanced Basics (Page 25) MSDN Magazine - December 2008 - Advanced Basics (Page 26) MSDN Magazine - December 2008 - Advanced Basics (Page 27) MSDN Magazine - December 2008 - Advanced Basics (Page 28) MSDN Magazine - December 2008 - Cutting Edge (Page 29) MSDN Magazine - December 2008 - Cutting Edge (Page 30) MSDN Magazine - December 2008 - Cutting Edge (Page 31) MSDN Magazine - December 2008 - Cutting Edge (Page 32) MSDN Magazine - December 2008 - Cutting Edge (Page 33) MSDN Magazine - December 2008 - Cutting Edge (Page 34) MSDN Magazine - December 2008 - Cutting Edge (Page 35) MSDN Magazine - December 2008 - Cutting Edge (Page 36) MSDN Magazine - December 2008 - Patterns In Practice (Page 37) MSDN Magazine - December 2008 - Patterns In Practice (Page 38) MSDN Magazine - December 2008 - Patterns In Practice (Page 39) MSDN Magazine - December 2008 - Patterns In Practice (Page 40) MSDN Magazine - December 2008 - Patterns In Practice (Page 41) MSDN Magazine - December 2008 - Patterns In Practice (Page 42) MSDN Magazine - December 2008 - Patterns In Practice (Page 43) MSDN Magazine - December 2008 - Team System (Page 44) MSDN Magazine - December 2008 - Team System (Page 45) MSDN Magazine - December 2008 - Team System (Page 46) MSDN Magazine - December 2008 - Team System (Page 47) MSDN Magazine - December 2008 - Team System (Page 48) MSDN Magazine - December 2008 - Team System (Page 49) MSDN Magazine - December 2008 - Team System (Page 50) MSDN Magazine - December 2008 - Team System (Page 51) MSDN Magazine - December 2008 - Real-World WF (Page 52) MSDN Magazine - December 2008 - Real-World WF (Page 53) MSDN Magazine - December 2008 - Real-World WF (Page 54) MSDN Magazine - December 2008 - Real-World WF (Page 55) MSDN Magazine - December 2008 - Real-World WF (Page 56) MSDN Magazine - December 2008 - Real-World WF (Page 57) MSDN Magazine - December 2008 - Real-World WF (Page 58) MSDN Magazine - December 2008 - Real-World WF (Page 59) MSDN Magazine - December 2008 - Real-World WF (Page 60) MSDN Magazine - December 2008 - Real-World WF (Page 61) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 62) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 63) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 64) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 65) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 66) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 67) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 68) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 69) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 70) MSDN Magazine - December 2008 - Visual Studio OBA Tools (Page 71) MSDN Magazine - December 2008 - SOA Data Access (Page 72) MSDN Magazine - December 2008 - SOA Data Access (Page 73) MSDN Magazine - December 2008 - SOA Data Access (Page 74) MSDN Magazine - December 2008 - SOA Data Access (Page 75) MSDN Magazine - December 2008 - SOA Data Access (Page 76) MSDN Magazine - December 2008 - SOA Data Access (Page 77) MSDN Magazine - December 2008 - SOA Data Access (Page 78) MSDN Magazine - December 2008 - SOA Data Access (Page 79) MSDN Magazine - December 2008 - SOA Data Access (Page 80) MSDN Magazine - December 2008 - SOA Data Access (Page 81) MSDN Magazine - December 2008 - Geneva Framework (Page 82) MSDN Magazine - December 2008 - Geneva Framework (Page 83) MSDN Magazine - December 2008 - Geneva Framework (Page 84) MSDN Magazine - December 2008 - Geneva Framework (Page 85) MSDN Magazine - December 2008 - Geneva Framework (Page 86) MSDN Magazine - December 2008 - Geneva Framework (Page 87) MSDN Magazine - December 2008 - Geneva Framework (Page 88) MSDN Magazine - December 2008 - Geneva Framework (Page 89) MSDN Magazine - December 2008 - Geneva Framework (Page 90) MSDN Magazine - December 2008 - Test Run (Page 91) MSDN Magazine - December 2008 - Test Run (Page 92) MSDN Magazine - December 2008 - Test Run (Page 93) MSDN Magazine - December 2008 - Test Run (Page 94) MSDN Magazine - December 2008 - Test Run (Page 95) MSDN Magazine - December 2008 - Test Run (Page 96) MSDN Magazine - December 2008 - Test Run (Page 97) MSDN Magazine - December 2008 - Test Run (Page 98) MSDN Magazine - December 2008 - Test Run (Page 99) MSDN Magazine - December 2008 - Test Run (Page 100) MSDN Magazine - December 2008 - Foundations (Page 101) MSDN Magazine - December 2008 - Foundations (Page 102) MSDN Magazine - December 2008 - Foundations (Page 103) MSDN Magazine - December 2008 - Foundations (Page 104) MSDN Magazine - December 2008 - Foundations (Page 105) MSDN Magazine - December 2008 - Foundations (Page 106) MSDN Magazine - December 2008 - Foundations (Page 107) MSDN Magazine - December 2008 - Foundations (Page 108) MSDN Magazine - December 2008 - Windows With C++ (Page 109) MSDN Magazine - December 2008 - Windows With C++ (Page 110) MSDN Magazine - December 2008 - Windows With C++ (Page 111) MSDN Magazine - December 2008 - Windows With C++ (Page 112) MSDN Magazine - December 2008 - Going Places (Page 113) MSDN Magazine - December 2008 - Going Places (Page 114) MSDN Magazine - December 2008 - Going Places (Page 115) MSDN Magazine - December 2008 - Going Places (Page 116) MSDN Magazine - December 2008 - Going Places (Page 117) MSDN Magazine - December 2008 - Going Places (Page 118) MSDN Magazine - December 2008 - Going Places (Page 119) MSDN Magazine - December 2008 - End Bracket (Page 120) MSDN Magazine - December 2008 - End Bracket (Page Cover3) MSDN Magazine - December 2008 - End Bracket (Page Cover4)
For optimal viewing of this digital publication, please enable JavaScript and then refresh the page. If you would like to try to load the digital publication without using Flash Player detection, please click here.