C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DrawStringで文字列の寸法を求める方法をお教え下さい


(過去ログ 99 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■59324 / inTopicNo.1)  DrawStringで文字列の寸法を求める方法をお教え下さい
  
□投稿者/ mine (22回)-(2011/05/22(Sun) 10:38:53)

分類:[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

引用返信 編集キー/
■59328 / inTopicNo.2)  Re[1]: DrawStringで文字列の寸法を求める方法をお教え下さい
□投稿者/ piyo (1回)-(2011/05/22(Sun) 15:38:33)
GraphicsのMeasureStringを使ってみてはどうですか?
引用返信 編集キー/
■59334 / inTopicNo.3)  Re[2]: DrawStringで文字列の寸法を求める方法をお教え下さい
□投稿者/ mine (24回)-(2011/05/22(Sun) 18:07:00)
No59328 (piyo さん) に返信
piyo さん 早速にご指導有り難う御座います。
> GraphicsのMeasureStringを使ってみてはどうですか?
MeasureStringは使ってみたのですがTextRenderer.MeasureTextでTextFormatFlags.NoPadding
を使って寸法を求めるのと同じOptionが無いように思います。
MeasureStringでは文字列の周囲にある程度の余白を見て寸法を求めているため、この寸法を用いて
下付き文字を追加しようとすると間隔が開きすぎて具合が悪いのです。
MeasureStringでFont.Sizeに応じてどの様な余白を見ているのかが判ればコード上で修正することも
可能かとは思います。
お知恵をお貸し下さい。 よろしくお願い申し上げます。
引用返信 編集キー/
■59336 / inTopicNo.4)  Re[3]: DrawStringで文字列の寸法を求める方法をお教え下さい
□投稿者/ Hongliang (778回)-(2011/05/22(Sun) 18:27:02)
MSDN の Graphics.MeasureString の解説に余白に関する記述がありますが、いかがでしょうか?
引用返信 編集キー/
■59402 / inTopicNo.5)  Re[4]: DrawStringで文字列の寸法を求める方法をお教え下さい
□投稿者/ mine (25回)-(2011/05/25(Wed) 08:28:25)
No59336 (Hongliang さん) に返信
Hongliang さん ご指導有り難う御座います。
> MSDN の Graphics.MeasureString の解説に余白に関する記述がありますが、いかがでしょうか?
早速MeasureStringについて色々調べてみました。 余白についての記述は見つけられなかったのですが
余白分をコードで修正することで実用上は問題を解決出来ました。
更に調査したところMeasureCharacterRangesを使うと文字列の寸法をより正確に計測出来ることが判り
現在この方法で検討を進めています。
調査及び確認を行っていたためお礼の返信が大変遅くなったことをお詫び申し上げます。
お陰で問題解決です。 本当に有り難う御座います。 重ねて御礼申し上げます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -