| 
                 分類:[VB.NET/VB2005 以降] 
 
 VisualStudio2005(VB)で計算式を表示させようと思っています。
以前質問させて頂いて多くの方から制御文字を使うしか仕方がないと教えて頂きましたので、
現在この方法に取り組んでいます。
ところが例えば下付き文字を表示しようとするとその前の文字列の正確な寸法が必要になります。
GDIを使用しているTextRenderer.MeasureTextを使えばTextRenderer.DrawTextで表示させる文字列の正しい寸法が
判るのですがGDI+を使用しているGraphicsのDrawStringで文字列を表示するとMeasureTextでは正しい寸法が
判りません。 このため不正な表示になってしまいます。
TextRendererでは印刷やDrawLineの様なことが出来ないので困ります。
何方かGraphicsのDrawStringで文字列の正確な寸法を求める方法をお教え下さい。
下記のコードはTextRendererとGraphicsによる差を確認するために作りました。
簡単にするため下付き文字はFontSizeのみの変更にしています。
Form1にPictureBox1,Button1が配置してありButton1をClickすることでTextRendererと
Graphicによる表示がPicturebox1に表示されます。
Graphicによる表示では下付き文字("u")の表示位置がずれて前の文字列に重なっています。
Public Class Form1
    Dim startPoint As New Point(10, 10)
    Dim stringsToPaint() As String = {"123 × A + 45 × B = D", "u"}
    Dim fontsStd = New Font("MS 明朝", 14, FontStyle.Regular)
    Dim fontsSuffix = New Font("MS 明朝", 7, FontStyle.Regular)
    'Invalidate前に描画されないようにするためのFlag
    Dim flgShow As Boolean = False
    Dim fontReg As Font = New Font("Arial", 11, FontStyle.Regular)
    Dim fontSuffix As Font = New Font("Arial", 7, FontStyle.Regular)
    '************************************************************
    ' Sub DrawText1
    '  TextRenderer.maasureTextで文字列の寸法を計測し
    '  TextRenderer.DrawTextで文字列を接続すれば正しく表示される。
    '************************************************************
    Private Sub DrawText1(ByVal g As Graphics)
        Dim startPoint As New Point(30, 30)
        ' Declare a proposed size with dimensions set to the maximum integer value.
        Dim proposedSize As Size = New Size(Integer.MaxValue, Integer.MaxValue)
        ' Measure each string with its font and NoPadding value and draw it by DrawText.
        For i As Integer = 0 To stringsToPaint.Length - 1
            Dim size As Size = TextRenderer.MeasureText(g, _
                stringsToPaint(i), fontReg, proposedSize, TextFormatFlags.NoPadding)
            Dim rect As Rectangle = New Rectangle(startPoint, Size)
            'stringsToPaint(i)を続けて表示
            TextRenderer.DrawText(g, stringsToPaint(i), fontReg, _
                startPoint, Color.Black, TextFormatFlags.NoPadding)
            startPoint.X += size.Width
        Next
    End Sub
    '************************************************************
    ' Sub DrawText2
    '  TextRenderer.maasureTextで文字列の寸法を計測し
    '  DrawStringで文字列を接続すると表示が不正となる。
    '************************************************************
    Private Sub DrawText2(ByVal g As Graphics)
        Dim startPoint As New Point(30, 50)
        ' Declare a proposed size with dimensions set to the maximum integer value.
        Dim proposedSize As Size = New Size(Integer.MaxValue, Integer.MaxValue)
        ' Measure each string with its font and NoPadding value and draw it by DrawString.
        For i As Integer = 0 To stringsToPaint.Length - 1
            Dim size As Size = TextRenderer.MeasureText(g, _
                stringsToPaint(i), fontReg, proposedSize, TextFormatFlags.NoPadding)
            Dim rect As Rectangle = New Rectangle(startPoint, size)
            g.DrawString(stringsToPaint(i), fontReg, Brushes.Black, startPoint.X, startPoint.Y)
            startPoint.X += size.Width
        Next
    End Sub
    '************************************************************
    ' PictureBox1への描画
    '************************************************************
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) _
        Handles PictureBox1.Paint
        If flgShow = True Then
            Call DrawText1(e.Graphics)      '印刷にはTextRenderer.DrawTextは使えない
            Call DrawText2(e.Graphics)
        End If
    End Sub
    '************************************************************
    ' PictureBox1への描画開始
    '************************************************************ 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click
        flgShow = True
        PictureBox1.Invalidate()
    End Sub
  |