-2

文字列を長方形に分散させたい。

ここに画像の説明を入力

各文字セット位置を除く

Rectangle  displayRectangle = new Rectangle (new Point(40, 40), new Size (80, 80));

StringFormat format1 = new StringFormat(StringFormatFlags.NoClip);

format1.LineAlignment = StringAlignment.Center; 

e.Graphics.DrawRectangle(Pens.Black, displayRectangle);

e.Graphics.DrawString("Showing Format1", this.Font,

Brushes.Black, (RectangleF)displayRectangle, format1);

ただし、StringFormat アライメントにはディストリビュート アライメントがありません。それで、文字列を長方形に分散する方法を知りたいです。

4

3 に答える 3

1

文字を表示長方形の中央に均等に分散させたい場合は、次のようにします。

完全正当化

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        string text = "this is distribute";

        Rectangle displayRectangle = new Rectangle(new Point(40, 40), new Size(400, 80));
        e.Graphics.DrawRectangle(Pens.Black, displayRectangle);

        int step = displayRectangle.Width / text.Length;
        SizeF szF = e.Graphics.MeasureString(text, this.Font); // just to get the HEIGHT

        int y = (displayRectangle.Y + displayRectangle.Height / 2) - (int)szF.Height / 2;
        for (int i = 0; i < text.Length; i++)
        {
            e.Graphics.DrawString(text.Substring(i, 1), this.Font, Brushes.Black, displayRectangle.X + (i * step), y);
        }
    }
于 2013-05-22T15:00:59.013 に答える
1

今のところ、Win32 API を使用できる/使用する予定であると仮定します (例: P/Invoke 経由)。.NET には、これから提案する関数のラッパーが含まれている可能性があります (ただし、そうでない場合もあります。よくわかりません)。もしそうなら、それを見つけて使うのはあなた次第です。とにかく、私が提案していることのほとんどは、機能よりも基本的なアプローチに関するものです。

を使用できますGetTextExtentExPointI。これは、指定した文字セットを保持するために必要な四角形のサイズと、(重要なことに) その四角形内の各文字の水平位置を計算します。

したがって、これを使用して、長方形のサイズとその長方形内の各文字の位置を計算し、文字の通常のカーニングを想定しています。次に、その長方形の幅を実際に必要な幅に分割します。これにより、そのキャラクターを目的の位置に配置するために各位置を増やす必要がある係数が得られます。次に、各文字に対して返された位置にその係数を掛けて、目的の位置を取得します。

たとえば、通常の間隔の文字の位置が 0、17、35、および 44 であるとします。また、ターゲットの四角形が、通常の間隔で計算された四角形の 1.8 倍の幅であると仮定しましょう。これらの各位置を取得し、1.8 を掛けてその文字に使用する位置を取得し、「修正された」位置に 0、31、63、および 79 を与えます。

次に、(当然のことながら) 文字列を調べて、計算された位置に各文字を描画します。

于 2013-05-22T03:09:24.843 に答える