0

を使用して文字列を描画していてGraphics.DrawString、末尾のスペースを含めたいので、を使用します StringFormatFlags.MeasureTrailingSpaces。単一行の文字列の場合、これは正常に機能しますが、改行文字によって行末に空白が生じることに気付きました。これは私が望んでいることではありません(そして誰がそうするのだろうか)。

MyDrawStringそこで、次の出力を作成するメソッドを実装したいと思います。|右揃えの描画操作のx座標です。実装は、中央に配置された文字列に対しても機能するはずです。

MyDrawString("Test")              ->       Test|

MyDrawString("Test   ")           ->    Test   |

MyDrawString("Test\r\nLine 2   ") ->       Test|
                                      Line 2   |

残念ながら、最後の呼び出しの出力は次のようになります

                                         Test  |
                                      Line 2   |

文字列を分割して1行ずつ描画せずに、目的を達成する方法はありますか?

DrawStringそうでない場合、1回の呼び出しで使用するのと同じ垂直位置に個別に線を引くための最良のアプローチは何でしょうか。MeasureString().Height2本の線の間の完全な距離を教えてくれませんでした。

アップデート

複数行の文字列を描画するときに行の高さを決定する方法を説明するこのMSDNページを見つけました。それでも、テキストブロック全体だけでなく、個々の行の垂直方向の配置を処理DrawStringする単一の呼び出しを使用したいと思います。DrawStringヒントはありますか?

4

1 に答える 1

0

私の場合、カスタム実装を非常に簡単にするテキストの境界矩形があることがわかりました。

    Public Shared Sub MyDrawString(ByVal g As Drawing.Graphics, _
                                   ByVal text As String, _
                                   ByVal font As Drawing.Font, _
                                   ByVal brush As Drawing.Brush, _
                                   ByVal layoutRect As Drawing.RectangleF, _
                                   ByVal stringFormat As Drawing.StringFormat)

        Dim lineSpacingPixel As Single
        lineSpacingPixel = font.Size * font.FontFamily.GetLineSpacing(font.Style) / _
            font.FontFamily.GetEmHeight(font.Style)

        Dim lines() As String
        lines = text.Split(New String() {vbCrLf}, StringSplitOptions.None)

        For i = 0 To lines.Count - 1
            Dim rect As Drawing.RectangleF
            rect = New Drawing.RectangleF(layoutRect.X, layoutRect.Y + i * lineSpacingPixel, _
                                          layoutRect.Width, _
                                          layoutRect.Bottom - layoutRect.Y - i * lineSpacingPixel)

            g.DrawString(lines(i), font, brush, rect, stringFormat)
        Next i

    End Sub

layoutRectのサイズが描画されるテキストのサイズと一致しなかった場合は、ワードラップとLineAlignmentを考慮に入れるためにコードを調整する必要があることに注意してください。

于 2013-03-28T08:58:23.057 に答える