To obtain each character position of a single-line text sting drawn by the GdiGraphics.DrawString method, use method Font.GetCharacterPositions(String, Single). It returns an array containing the X coordinate of each character in a given text string. If font tracking is modified with Tracking property, it is taken into account. The code example below demonstrates how to use this array to draw text on the curve:
This image was produced with the following code:
Const centerX As Integer = 150 Const centerY As Integer = 150 Const radius As Integer = 110 'Create Bitmap object Dim bitmap As New Aurigma.GraphicsMill.Bitmap(300, 150, _ Aurigma.GraphicsMill.PixelFormat.Format24bppRgb) Dim graphics As Aurigma.GraphicsMill.Drawing.GdiGraphics = _ bitmap.GetGdiGraphics() 'Fill background graphics.FillRectangle(New Aurigma.GraphicsMill.Drawing.SolidBrush( _ Aurigma.GraphicsMill.RgbColor.White), 0, 0, bitmap.Width, bitmap.Height) ' Adjust font settings Dim font As New Aurigma.GraphicsMill.Drawing.Font( _ "Times New Roman", 37, False, False) font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Bottom font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center Dim text As String = "Rounded sample text" 'Get characters positions Dim positions As Single() = font.GetCharacterPositions(text, 0) 'Get string width Dim strWidth As Single = font.MeasureString(text).Width 'Get string height Dim strHeight As Single = font.MeasureString(text).Height 'Draw ellipse graphics.DrawEllipse(New Aurigma.GraphicsMill.Drawing.Pen( _ Aurigma.GraphicsMill.RgbColor.Black, 1), 40, 40, 220, 220) Dim brush As New Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black) 'Draw character by character For i As Integer = 0 To text.Length - 1 Dim charWidth As Single = font.GetBlackBox(text(i)).Width 'Compute angle to which current character will be rotated. Rotation will be 'performed relative to the middle of the bottom side of the character. Dim angle As Single = Math.PI - (positions(i) + charWidth / 2.0F) * Math.PI / strWidth 'Compute the x and y coordinate of the bottom/top* middle* of the character Dim x As Single = centerX + radius * Math.Cos(angle) Dim y As Single = centerY - radius * Math.Sin(angle) Dim rotateMatrix As New System.Drawing.Drawing2D.Matrix() 'Convert angle from radians to degrees Dim degAngle As Single = angle / Math.PI * 180 rotateMatrix.RotateAt(90 - degAngle, New System.Drawing.PointF(x, y)) graphics.Transform = rotateMatrix graphics.DrawString(text(i).ToString(), font, brush, x, y) Next
const int centerX = 150; const int centerY = 150; const int radius = 110; //Create Bitmap object Aurigma.GraphicsMill.Bitmap bitmap = new Aurigma.GraphicsMill.Bitmap(300, 150, Aurigma.GraphicsMill.PixelFormat.Format24bppRgb); Aurigma.GraphicsMill.Drawing.GdiGraphics graphics = bitmap.GetGdiGraphics(); //Fill background graphics.FillRectangle(new Aurigma.GraphicsMill.Drawing.SolidBrush( Aurigma.GraphicsMill.RgbColor.White), 0, 0, bitmap.Width, bitmap.Height); //Adjust font settings Aurigma.GraphicsMill.Drawing.Font font = new Aurigma.GraphicsMill.Drawing.Font("Times New Roman", 37, false, false); font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Bottom; font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center; string text = "Rounded sample text"; //Get characters positions float[] positions = font.GetCharacterPositions(text, 0); //Get string width float strWidth = font.MeasureString(text).Width; //Get string height float strHeight = font.MeasureString(text).Height; //Draw ellipse graphics.DrawEllipse(new Aurigma.GraphicsMill.Drawing.Pen( Aurigma.GraphicsMill.RgbColor.Black, 1), 40, 40, 220, 220); Aurigma.GraphicsMill.Drawing.SolidBrush brush = new Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black); //Draw character by character for (int i = 0; i < text.Length; i++) { float charWidth = font.GetBlackBox(text[i]).Width; //Compute angle to which rotate current character. Rotation will be //performed relative to the middle of the bottom side of the character. float angle = (float)(Math.PI - (positions[i] + charWidth / 2.0f) * Math.PI / strWidth); //Compute the x and y coordinate of the bottom/top* middle* of the character float x = (float)(centerX + radius * Math.Cos(angle)); float y = (float)(centerY - radius * Math.Sin(angle)); System.Drawing.Drawing2D.Matrix rotateMatrix = new System.Drawing.Drawing2D.Matrix(); //Convert angle from radians to degrees float degAngle = (float)(angle / Math.PI * 180); rotateMatrix.RotateAt(90 - degAngle, new System.Drawing.PointF(x, y)); graphics.Transform = rotateMatrix; graphics.DrawString(text[i].ToString(), font, brush, x, y); }