ProblemYou want to draw some nicely formatted text on the drawing surface. SolutionSample code folder: Chapter 09\DrawingText The primary tool for drawing text is the Graphics.DrawString() method. To make adjustments to the text, you can alter the font's properties, apply transformations to the canvas itself, or use a StringFormat object. This recipe's sample code uses each of these methods to display a string of text. DiscussionCreate a new Windows Forms application, and add the following controls to Form1:
Add informational labels if desired. The form should look like Figure 9-25. Figure 9-25. The controls on the text drawing sampleFigure 9-25. Now add the following source code to the form's class template: Private Sub ActDisplay_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ActDisplay.Click ' ----- Force the text to redisplay. DrawingArea.Invalidate() End Sub Private Sub DrawingArea_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) _ Handles DrawingArea.Paint ' ----- Refresh the drawing area. Dim mainFont As Font Dim textArea As Rectangle Dim textStyle As New FontStyle Dim textFormat As StringFormat Dim alignParts() As String ' ----- Clear any existing content. e.Graphics.Clear(Color.White) ' ----- Build the font used for the display text. textStyle = FontStyle.Regular If (UseBold.Checked = True) Then _ textStyle = textStyle Or FontStyle.Bold If (UseItalic.Checked = True) Then _ textStyle = textStyle Or FontStyle.Italic If (UseUnderline.Checked = True) Then _ textStyle = textStyle Or FontStyle.Underline If (UseStrikeout.Checked = True) Then _ textStyle = textStyle Or FontStyle.Strikeout mainFont = New Font("Arial", 12, textStyle) ' ----- Move the (0,0) origin to the center of the ' display. e.Graphics.TranslateTransform( _ DrawingArea.ClientRectangle.Width / 2, _ DrawingArea.ClientRectangle.Height / 2) ' ----- Determine where the main text will go. The Offset ' method repositions the rectangle's coordinates ' by the given X and Y values. textArea = New Rectangle(20, 20, _ DrawingArea.ClientRectangle.Width - 40, _ DrawingArea.ClientRectangle.Height - 40) textArea.Offset( _ -CInt(DrawingArea.ClientRectangle.Width / 2), _ -CInt(DrawingArea.ClientRectangle.Height / 2)) ' ----- Prepare the alignment. textFormat = New StringFormat alignParts = Split(DisplayAlign.Text, ",") Select Case alignParts(0) Case "Left" textFormat.Alignment = StringAlignment.Near Case "Center" textFormat.Alignment = StringAlignment.Center Case "Right" textFormat.Alignment = StringAlignment.Far End Select Select Case alignParts(1) Case "Top" textFormat.LineAlignment = StringAlignment.Near Case "Middle" textFormat.LineAlignment = StringAlignment.Center Case "Bottom" textFormat.LineAlignment = StringAlignment.Far End Select ' ----- Rotate the world if requested. If (DisplayRotate.Value <> 0) Then e.Graphics.RotateTransform(DisplayRotate.Value) End If ' ----- Draw the bounding box if requested. If (ShowBoundingBox.Checked = True) Then e.Graphics.DrawRectangle(Pens.Gray, textArea) End If ' ----- Draw the main text. e.Graphics.DrawString(DisplayText.Text, mainFont, _ Brushes.Black, textArea, textFormat) ' ----- Clean up. mainFont.Dispose() End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' ----- Build the list of alignments. DisplayAlign.Items.Add("Left,Top") DisplayAlign.Items.Add("Left,Middle") DisplayAlign.Items.Add("Left,Bottom") DisplayAlign.Items.Add("Center,Top") DisplayAlign.Items.Add("Center,Middle") DisplayAlign.Items.Add("Center,Bottom") DisplayAlign.Items.Add("Right,Top") DisplayAlign.Items.Add("Right,Middle") DisplayAlign.Items.Add("Right,Bottom") DisplayAlign.SelectedIndex = 0 End Sub To use the program, enter some text in the TextBox field, and adjust the other controls as desired to alter the text. Then click the Display button to refresh the displayed text. Figure 9-26 shows some sample text displayed through the program. Figure 9-26. Rotated and embellished textThe Graphics. DrawString() method is pretty simple to use: you pass it a text string, a position (or bounding rectangle), a font, and a colored or patterned brush, and the text appears on the canvas. Except for how the position and boundaries of the text are specified, there isn't that much flexibility in the method itself. However, there is flexibility in the values passed to the method. Changes to the font or font styles, as demonstrated in this code, clearly have an impact on the results. Similarly, you can create any type of solid, patterned, or image-based brush, and use it to draw the text itself. Transformations made to the canvas also impact the text output. This recipe's code applies two transformations to the canvas: it repositions the X-Y coordinate system origin from the upper-left corner of the canvas to the center, and it rotates the canvas if requested by the user so that the text appears rotated. Recipe 9.18 discusses the reasons for these two transformations in more detail. The Drawing.StringFormat class, used in this sample to align the text within its bounding box, provides additional text-drawing options. The StringFormat.FormatFlags property lets you set options that adjust how the text appears in its bounding box. For instance, you can indicate whether the text should automatically wrap or not. The StringFormat.HotkeyPrefix property lets you indicate which character should be used to draw shortcut-key underlines below specific letters of the text, as is done using "&" in Label and other controls. See AlsoMany of the recipes in this chapter show text being formatted and output in a variety of formats and displays. |