VB.Net Tutorial/2D Graphics/Measure String

Материал из VB Эксперт
Перейти к: навигация, поиск

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>