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

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

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

DrawStringについて


(過去ログ 5 を表示中)

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

■5571 / inTopicNo.1)  DrawStringについて
  
□投稿者/ Nausika 二等兵(1回)-(2006/08/17(Thu) 05:15:38)

分類:[C#] 


分類:[C#] 

C#と.NETを使って自作のエディタコントロールを作ろうと挑戦していて
文字の描画のところで疑問があります。

エディタコントロールは.NETのControlクラスを継承して
OnPaintメソッドをオーバーライドして、描画処理を行っています。
こんな感じです。

public partial class EditControl : Control
{
...
protected override void OnPaint(PaintEventArgs e) { ... }
...
}

今、OnPaintメソッドの中で
Graphics g = e.Graphics;
として、Graphicsオブジェクトを取得後
g.DrawString(...);
で、文字列を描画しているのですが、DrawStringを使うと少々ずれが生じてしまいます。

以下実験結果ですが
フォームにLabelコントロールを貼り付けた場合と
Label l = new Label();
l.Font = new Font("MS ゴシック", 9.75F);
l.Text = "lllllllllllll";//(←アルファベット小文字のエル)
l.Location = new Point(0, 0);

GraphicsクラスのDrawStringメソッドを使用した場合と
//brush変数は別の場所で定義されているものとする
g.DrawString("lllllllllllll", new Font("MS ゴシック", 9.75F), brush, 0, 0);

この二つの場合で文字列"lllllllllllll"を比べてみた場合
微妙に表示がずれます。同じフォントを使用しているにもかかわらずに。
実際はLabelを使用した場合はMS ゴシックはきっちり等幅なのですが
DrawStringの場合はずれます。

今回はDrawStringを使ってきっちり等幅に表示させたいと思っています。
わかる方いらっしゃいますか??

ちなみに画像の赤丸で囲んである部分の
上側がLabelを貼り付けて表示した文字列で
下側がDrawStringを使用して表示した文字列です。

0
引用返信 編集キー/
■5606 / inTopicNo.2)  Re[1]: DrawStringについて
□投稿者/ Eiji 二等兵(1回)-(2006/08/18(Fri) 00:50:01)

分類:[C#] 

DrawStringの引数のStringFormatを適切に指定するとうまくいったような気が・・・。

StringFormat f = new StringFormat();
f.Trimming = StringTrimming.EllipsisCharacter;
f.FormatFlags = StringFormatFlags.NoWrap;
f.Alignment = StringAlignment.Near;
f.LineAlignment = StringAlignment.Center;
のような感じ?で作成し、StringFormatを引数に渡してみてください。

確認できる環境が今ないので、確認はできていません。


0
引用返信 編集キー/
■5619 / inTopicNo.3)  Re[2]: DrawStringについて
□投稿者/ Nausika 二等兵(2回)-(2006/08/18(Fri) 12:53:07)

分類:[C#] 

お返事ありがとうございました。

StringFormatの値をいろいろ変えてみて試してみたのですが
変化はありませんでした。

いったいどうしたらいいんでしょうかね...

0
引用返信 編集キー/
■5626 / inTopicNo.4)  Re[3]: DrawStringについて
□投稿者/ 中博俊 神(650回)-(2006/08/18(Fri) 17:09:49)
中博俊 さんの Web サイト

分類:[C#] 

labelがそのままDrawStringしているという思い込みがまずいんじゃないでしょうか?
1文字ずつDrawStringすると、ピクセルの端数の関係で同じになったりしませんか?

#ごそごそ補正かけているはず

0
引用返信 編集キー/
■5629 / inTopicNo.5)  Re[4]: DrawStringについて
□投稿者/ Nausika 二等兵(3回)-(2006/08/18(Fri) 17:55:26)

分類:[C#] 

お返事ありがとうございました。

確かにLabelの場合はそのままDrawStringしてるわけじゃないですかね。
思い込みしてました。

でも、それにしてもやっぱりDrawStringで描画するときの表示のずれは謎です。
1文字ずつDrawStringしてるととんでもなく時間かかりますし...

0
引用返信 編集キー/
■5633 / inTopicNo.6)  Re[5]: DrawStringについて
□投稿者/ Eiji 二等兵(2回)-(2006/08/19(Sat) 02:09:13)

分類:[C#] 

確認したところ、

StringFormatのFormatFlagsプロパティに
StringFormatFlags.MeasureTrailingSpaces
を設定するといいようです。

MeasureTrailingSpacesの説明を見ると
「各行末の空白を計測に含める場合はこのフラグを設定します。」
とあります。

(何でそうなるのかはドキュメントを見ても自分にはよく分かりませんが・・・。)



0
引用返信 編集キー/
■5678 / inTopicNo.7)  Re[6]: DrawStringについて
□投稿者/ Nausika 二等兵(4回)-(2006/08/19(Sat) 13:51:08)

分類:[C#] 

お返事ありがとうございます。

ご指摘の通りStringFormatのFormatFlagsプロパティに
StringFormatFlags.MeasureTrailingSpacesを設定して試してみました。

以下コード一部抜粋

Graphics g = e.Graphics;
StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.MeasureTrailingaSpaces;
Font f = new ("MS ゴシック", 10F, FontStyle.Regular, GraphicsUnit.Point);
g.DrawString("lllllllllllllll", f, brush, 0, 0, sf);

でもやっぱり微妙にずれてます。
Eijiさんの環境ではきっちりずれずに表示されたのですか?
だとしたらこれもう無理なんですかね...

0
引用返信 編集キー/
■5679 / inTopicNo.8)  Re[7]: DrawStringについて
□投稿者/ 中博俊 神(652回)-(2006/08/19(Sat) 15:00:21)
中博俊 さんの Web サイト

分類:[C#] 

(Windows 2000&Windows XP GOLD)とWindows XP SP1以上では描画の挙動が違いますよ。
えーとネタ元みつからず(^^;;;

0
引用返信 編集キー/
■5702 / inTopicNo.9)  Re[8]: DrawStringについて
□投稿者/ Eiji 二等兵(3回)-(2006/08/20(Sun) 02:01:32)

分類:[C#] 

No5679に返信(中博俊さんの記事)
> (Windows 2000&Windows XP GOLD)とWindows XP SP1以上では描画の挙動が違いますよ。
> えーとネタ元みつからず(^^;;;

環境はWindows XP SP2で確認しましたが、
こちらでは、ずれずに表示されます。
ちなみに
gdiplus.dll 5.1.3102.2180
(xpsp_sp2_rtm.040803-2158)
です。

Nausikaさんの環境はどうですか?

0
引用返信 編集キー/
■5713 / inTopicNo.10)  Re[9]: DrawStringについて
□投稿者/ Nausika 二等兵(5回)-(2006/08/20(Sun) 13:17:47)

分類:[C#] 

> 環境はWindows XP SP2で確認しましたが、
> こちらでは、ずれずに表示されます。
> ちなみに
> gdiplus.dll 5.1.3102.2180
> (xpsp_sp2_rtm.040803-2158)
> です。

Eijiさんとまったく同じ環境ですね。
使ってるdllもバージョンも同じです。

あれ、じゃぁどこが違うんでしょうか...

0
引用返信 編集キー/
■5715 / inTopicNo.11)  Re[10]: DrawStringについて
□投稿者/ 中博俊 神(657回)-(2006/08/20(Sun) 14:02:56)
中博俊 さんの Web サイト

分類:[C#] 

ちなみに一生懸命あわすことも大事でしょうが、Windowsの設定でDPIを変更するだけで破綻するシステムにならないように注意してくださいね。(^^

0
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -