DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PictureBoxでの文字列の右寄せについて

環境/言語:[WindowsXP,.NET Framework1.1]
分類:[.NET]

初めてこのような場に投稿させて頂きます。
VB.NETを勉強中の初心者です。

勉強の一環として、VB6.0の簡単なプログラムをVB.NETで作成し直しています。
今取り組んでいるプログラムに、ヘッダとして現在日付をPictureBox内に右寄せで表示する、という仕様があるのですが、この実装に四苦八苦しています。

MeasureStringメソッドを使用して現在日付文字列の長さを取得した後に、((PictureBoxのWidth)-(現在日付文字列のWidth))をDrawStringメソッドのx座標の値として与えてやれば良いと考えたのですが、この方法だときちんとした右寄せにならず、日付の右側に半角文字ほどのスペースが空いてしまいます。
余談ではありますが、今はこれを埋めるために無理やり日付文字列の前にvbNullCharを連結して出力しています。vbNullCharが終端文字であることを考えると、これで出力されることにも疑問を覚えます。(" "を入れてしまうと逆にPictureBoxからはみ出てしまうので仕方なくこうしています。)

文字コードや全角半角についてなど、文献等をあたってはみましたがあまりヒットせず、いまいち理解に至りません。
なぜ、このような現象が起きるのでしょうか。その仕組みを知りたいです。

不慣れなので、ご無礼がありましたらご指摘下さい。
よろしくお願い致します。
> MeasureStringメソッドを使用して現在日付文字列の長さを取得した後に、((PictureBoxのWidth)-(現在日付文字列のWidth))をDrawStringメソッドのx座標の値として与えてやれば良いと考えたのですが、この方法だときちんとした右寄せにならず、日付の右側に半角文字ほどのスペースが空いてしまいます。

Widthプロパティが枠を含めた全体の幅だからでしょう。
コントロールの内部の描画やコンテナの部分をクライアント領域といいます。
Client〜プロパティを調べてみてください。

> 余談ではありますが、今はこれを埋めるために無理やり日付文字列の前にvbNullCharを連結して出力しています。vbNullCharが終端文字であることを考えると、これで出力されることにも疑問を覚えます。(" "を入れてしまうと逆にPictureBoxからはみ出てしまうので仕方なくこうしています。)

これは今回の条件がすべてそろった場合のたまたまうまくいった策と考えてください。
いかなる場合もこのようなやり方は避けるべきでしょう。
■No14631に返信(まどかさんの記事)
> Widthプロパティが枠を含めた全体の幅だからでしょう。
> コントロールの内部の描画やコンテナの部分をクライアント領域といいます。
> Client〜プロパティを調べてみてください。

ご回答頂き、ありがとうございます。
クライアント領域に関してざっと目を通してみました。
PictureBoxの単なる幅ではなく、そのクライアント領域の幅を使用せよ、
という解釈でよろしいでしょうか。
PictureBoxに確かにそのようなプロパティがあるのですが、
うまく取得し、活用することができません。(未熟者ですみません。)

できもしないのにこんな質問はどうかと思うのですが、
ピクチャボックスには境界線やタイトル・バーなどの要素はないと思うのですが、
ウィンドウ領域とクライアント領域は同じにはならないのでしょうか。

> いかなる場合もこのようなやり方は避けるべきでしょう。
はい。このやり方に関しては自分でもどうかと思います。
ご指摘ありがとうございます。

遅々とした進行状況で申し訳ありませんが、
宜しければまたアドバイスをお願いします。
> ピクチャボックスには境界線やタイトル・バーなどの要素はないと思うのですが、
ん?
3D枠の境界線とかなかったっけ…(.NETになって枠が無くなったのかな…)
■No14634に返信(もさんの記事)
> 3D枠の境界線とかなかったっけ…(.NETになって枠が無くなったのかな…)

境界線はあります。
自分がBorderStyleをNoneに設定しているのでこんな表現になりました。
言葉が足りず、失礼しました。
> PictureBoxに確かにそのようなプロパティがあるのですが、
> うまく取得し、活用することができません。(未熟者ですみません。)


PictureBox1.ClientRectangle.Widthでいいんじゃないの?

> ピクチャボックスには境界線やタイトル・バーなどの要素はないと思うのですが、
> ウィンドウ領域とクライアント領域は同じにはならないのでしょうか。

それは結果論です。
単なるWidthでおこなうなら自力で枠の幅や枠の有無などを条件に計算しなければなりません。
その結果、たまたま今回は一致する?場合だったということです。

MearsureStringで指定しているフォントとサイズはPictureBoxと同じですよね?
#ちなみにそもそもぴったんこの値が返ってくるかどうかは未確認。。。
DOBON.NET .NET Tips - 文字列を描画したときの大きさを計測する
http://dobon.net/vb/dotnet/graphics/measurestring.html

で説明していますが、MeasureStringでは多少余白が入ります。MeasureCharacterRangesを使ってみてください。
■No14640に返信(管理人さんの記事)
> MeasureCharacterRangesを使ってみてください。

PictureBoxのClientRectangle.Widthを使用することで
自分の問題ありありコードと同じくらい右寄せにすることができました。
MeasureCharacterRangesを併用することで、
さらにPictureBoxぎりぎりまで右寄せにすることができました。

プロパティやメソッドを限定して、
その範囲内だけで悩んでいたのが良くなかった気がします。
なかなか一人では原因に辿り着けませんが、
もう少し視点を変えて情報を探す努力をしていこうと思います。

どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板