- ベストアンサー
DrawText or DrawString
DrawTextやDrawStringで文字を描く際に一番左にスペースが入っているのか 最初の1文字目の幅を計ると他に比べると異常に大きかったです。正確な位置に 描くにはどうしたらいいのでしょうか System.Windows.Forms.TextRenderer.DrawText( g, "ああああああ。", fnt, new Point(0, 0), Color.Blue); としています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
数値は合ってます。 http://dobon.net/vb/dotnet/graphics/measurestring.html >グリフの突出に備えて前後に余白を入れます それ以外に、1つ1つのフォントにも余白があります。 アセント(Ascent)、ディセント(Descent)、レディング(Leading) ベアリング(bearing)など http://www.jagat.or.jp/story_memo_view.asp?StoryID=1602 基本的に、これらの余白は空けておくべきです。 敢えて削る場合は、 先のDOBONさんのところのサンプルのように MeasureCharacterRanges を使います。 縦方向のアセント、ディセントなどは Font.FontFamily から取得します。 http://penguinlab.jp/blog/post/117
その他の回答 (2)
- MARU4812
- ベストアンサー率43% (196/452)
このままでは動かない不完全なコードを見せられても。。。 バグもありそうだし。。。 ・txt が設定されていない。(this.Text1.Text と仮定) ・font が設定されていない。(デフォルトの MS UI Gothic, 9pt と仮定) ・str が Substring でどう変化しているのか確認していない。 ・上記処理に伴い wordSize.Width がどう変化しているのか確認していない。 ・最初の質問の DrawText と wordSize の関連が書かれていない。 ※TextRenderer に Size を覚える機能は無いので Font のサイズのままなのでは。
補足
大変失礼しました。はしょりすぎました ソースとしては以下になります。やりたいこととしては 文字を描く処理なのですが画像の幅が解像度を超えてしまうと 文字が欠けてしまう為、描画する文字列の幅が解像度を超えると //処理 を実行します。 //処理の中身としては例えば10文字目で解像度の幅を超える場合 9文字目までを描画して保存する形になります。DrawTextとwordSizeは ここで使用します。 strはそのまま1文字目から~文字数まで変化します。 例:ああああ i=0→あ i=1→ああ i=2→あああ i=3→ああああ wordSizeはi=0~lengthの各幅を取得できているつもり・・です。 i=0で幅124 i=1で幅206 i=2で幅288 i=3で幅370 です。 i=1~3までは82ずつ増大してるのにi=0は124で やたら大きくなっています。この理由が知りたいです。 private void button1_Click(object sender, EventArgs e) { Size wordSize; Font font = new System.Drawing.Font("MS UI Gothic",100,GraphicsUnit.Pixel); Bitmap bmp = new Bitmap(1920, font.Height); int length = this.textBox1.Text.Length; for (int i = 0; i < length; i++) { Graphics g = Graphics.FromImage(bmp); string str = this.textBox1.Text.Substring(0, i + 1); wordSize = TextRenderer.MeasureText(g, str, font); if (wordSize.Width > 1920) { //処理 } } }
- MARU4812
- ベストアンサー率43% (196/452)
> 最初の1文字目の幅を計ると他に比べると異常に大きかったです。 他とは?2文字目以降のことですか?計るとは?実際にプログラムで 数値を出力したのですか?それなら検証に使ったコードも公開して 下さい。目で見ただけなら、Point(0, 0) の基準がどこになっているか 確認して下さい(描画領域の Rectangle に枠を描画してみるとか)。 設定した通りの描画しかしないので、何もせずに1文字目の幅だけ 変わる事はありません。 g が変数になっていることから、他のコントロールの Graphics を使ってしまっているのでは?そのコントロールの左端から描画 されていませんか?
補足
Bitmap bmp = new Bitmap(1920, 150); length = this.Text1.Text.Length; for (int i = 0; i < length; i++) { g = Graphics.FromImage(bmp); str = txt.Substring(0, i + 1); wordSize = TextRenderer.MeasureText(g, str, font); } こんな感じで1文字ずつの幅とってます2文字目からは fontの幅分だけ増大してますが1文字目だけなんか大きいです。
お礼
なるほど、仕組みがよくわかりました。 ありがとうございました