14

Graphics.DrawString を使用するときに文字間隔を制御することは何とか可能ですか? それを可能にする DrawString または Font へのオーバーロードが見つかりません。

g.DrawString("MyString", 
             new Font("Courier", 44, GraphicsUnit.Pixel), 
             Brushes.Black, 
             new PointF(262, 638));

文字間隔とは、文字間の距離を意味します。十分なスペースを追加すると、MyString は MyString のように見える可能性があります。

4

4 に答える 4

15

それはそのままではサポートされていません。各文字を個別に描画するか (正しく理解するのは難しい)、自分で文字列にスペースを挿入する必要があります。Graphics.ScaleTransform() を使用して文字を引き伸ばすことができますが、見栄えが悪くなります。

于 2010-06-03T19:50:56.877 に答える
8

または、GDI API 関数SetTextCharacterExtra(HDC hdc, int nCharExtra)( MSDN ドキュメント)を使用することもできます。

[DllImport("gdi32.dll", CharSet=CharSet.Auto)] 
public static extern int SetTextCharacterExtra( 
    IntPtr hdc,    // DC handle
    int nCharExtra // extra-space value 
); 

public void Draw(Graphics g) 
{ 
    IntPtr hdc = g.GetHdc(); 
    SetTextCharacterExtra(hdc, 24); //set spacing between characters 
    g.ReleaseHdc(hdc); 

    e.Graphics.DrawString("str",this.Font,Brushes.Black,0,0); 
}  
于 2010-07-12T12:23:03.560 に答える
2

ExtTextOut があなたの問題を解決すると本当に信じています。lpDx パラメータを使用して、文字間距離の配列を追加できます。関連する MSN ドキュメントは次のとおりです。

http://msdn.microsoft.com/en-us/library/dd162713%28v=vs.85%29.aspx

于 2012-05-11T03:18:45.250 に答える
1

サポートされていませんが、ハックとして、文字列内のすべての文字をループして、それぞれの間に空白文字を挿入することができます。そのための単純な関数を次のように作成できます。

編集 - Visual Studio でこれをやり直してテストしました - バグは削除されました。

private string SpacedString(string myOldString)
{

            System.Text.StringBuilder newStringBuilder = new System.Text.StringBuilder("");
            foreach (char c in myOldString.ToCharArray())
            {
                newStringBuilder.Append(c.ToString() + ' ');
            }

            string MyNewString = "";
            if (newStringBuilder.Length > 0)
            {
                // remember to trim off the last inserted space
                MyNewString = newStringBuilder.ToString().Substring(0, newStringBuilder.Length - 1);
            }
            // no else needed if the StringBuilder's length is <= 0... The resultant string would just be "", which is what it was intitialized to when declared.
            return MyNewString;
}

次に、上記のコード行は次のように変更されます。

          g.DrawString(SpacedString("MyString"), new Font("Courier", 44, GraphicsUnit.Pixel), Brushes.Black, new PointF(262, 638));
于 2010-06-03T20:20:10.337 に答える