VB.Net Tutorial/2D Graphics/Measure String
Measure string and draw rectangle around string
<source lang="vbnet">Imports System Imports System.Drawing Imports System.Collections Imports System.ruponentModel Imports System.Windows.Forms Imports System.Globalization
public class GraphicsMeasureStringRectangle
public Shared Sub Main Application.Run(New Form1) End Sub
End class Public Class Form1
Inherits System.Windows.Forms.Form Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint Dim g As Graphics = e.Graphics Dim s As String = "a multi-line string:" & vbCrLf & "line 2" & vbCrLf & "line 3" Dim y As Single = 0 Dim arrPens As Pen() = New Pen() {Pens.Red, Pens.Green, Pens.Blue} Dim line As String For Each line In s.Split(vbCrLf) Dim width As Single = ClientRectangle.Width Dim height As Single = ClientRectangle.Height - y Dim layoutRect As RectangleF = New RectangleF(0, y, width, height) Dim format As StringFormat = New StringFormat(StringFormatFlags.NoWrap Or StringFormatFlags.DisplayFormatControl) g.DrawString(line, Me.Font, Brushes.Black, layoutRect, format) Dim size As SizeF = g.MeasureString(line, Me.Font, layoutRect.Size, format) g.DrawRectangle(arrPens(CInt(y / Me.Font.GetHeight(g))), 0, y, size.Width, size.Height) y = y + Me.Font.GetHeight(g) Next End Sub
Public Sub New() MyBase.New() InitializeComponent() End Sub Private components As System.ruponentModel.IContainer <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(20, 60) Me.Name = "Form1" Me.Text = "Form1" Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) End Sub
End Class</source>
Measure string and draw string
<source lang="vbnet">Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms public class MeasureString
public Shared Sub Main Application.Run(New Form1) End Sub
End class Public Class Form1
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim textArea As SizeF Dim linePen As Pen Dim largeFont As Font Dim fontRatio As Single Dim ascentSize As Single Dim descentSize As Single Dim emSize As Single Dim cellHeight As Single Dim internalLeading As Single Dim externalLeading As Single e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias largeFont = New Font("Times New Roman", 96, FontStyle.Regular) fontRatio = largeFont.Height / largeFont.FontFamily.GetLineSpacing(FontStyle.Regular) textArea = e.Graphics.MeasureString("AbcJgp", largeFont) e.Graphics.DrawString("AbcJgp", largeFont, Brushes.Black, 0, 0) linePen = New Pen(Color.Gray, 1) linePen.DashStyle = Drawing2D.DashStyle.Dash ascentSize = largeFont.FontFamily.GetCellAscent(FontStyle.Regular) * fontRatio descentSize = largeFont.FontFamily.GetCellDescent(FontStyle.Regular) * fontRatio emSize = largeFont.FontFamily.GetEmHeight(FontStyle.Regular) * fontRatio cellHeight = ascentSize + descentSize internalLeading = cellHeight - emSize externalLeading = (largeFont.FontFamily.GetLineSpacing(FontStyle.Regular) * fontRatio) - cellHeight e.Graphics.DrawLine(linePen, 0, 0, textArea.Width, 0) e.Graphics.DrawLine(linePen, 0, textArea.Height, textArea.Width, textArea.Height) e.Graphics.DrawLine(linePen, 0, ascentSize, textArea.Width, ascentSize) e.Graphics.DrawLine(linePen, 0, ascentSize + descentSize, textArea.Width, ascentSize + descentSize) linePen.Dispose() largeFont.Dispose() e.Graphics.ResetTransform() End Sub
End Class
<Global.Microsoft.VisualBasic.rupilerServices.DesignerGenerated()> _ Partial Class Form1
Inherits System.Windows.Forms.Form "Form overrides dispose to clean up the component list. <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then components.Dispose() End If MyBase.Dispose(disposing) End Sub "Required by the Windows Form Designer Private components As System.ruponentModel.IContainer "NOTE: The following procedure is required by the Windows Form Designer "It can be modified using the Windows Form Designer. "Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() Me.PictureBox1 = New System.Windows.Forms.PictureBox CType(Me.PictureBox1, System.ruponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() " "PictureBox1 " Me.PictureBox1.BackColor = System.Drawing.Color.White Me.PictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle Me.PictureBox1.Location = New System.Drawing.Point(8, 8) Me.PictureBox1.Name = "PictureBox1" Me.PictureBox1.Size = New System.Drawing.Size(550, 224) Me.PictureBox1.TabIndex = 0 Me.PictureBox1.TabStop = False " "Form1 " Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(600, 242) Me.Controls.Add(Me.PictureBox1) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.MaximizeBox = False Me.Name = "Form1" Me.Text = "Measuring Text" CType(Me.PictureBox1, System.ruponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) End Sub Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
End Class</source>