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

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

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

Re[3]: pictureboxへの文字罫線の描画について


(過去ログ 110 を表示中)

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

■65346 / inTopicNo.1)  pictureboxへの文字罫線の描画について
  
□投稿者/ まなか (1回)-(2013/02/19(Tue) 11:50:31)

分類:[C#] 

いつも勉強させて頂いております。
皆さんのお力をお借りしたく書き込ませて頂きます。

pictureboxに文字列を描画してラインを引き、表のようなものを作成したいと考えております(最終的にはプリンターへデータを送るため……)。
テストでフォームにpictureboxとボタンを作成しました。
ボタンイベントに下記のようなサンプルを作成してみました。
文字の描画はよかったのですが、各項目を切り分けるラインがずれてきてしまい、文字にかぶってしまいます。

           g.PageUnit = GraphicsUnit.Point;

部分でポイントに単位を設定したつもりなのですが、うまくいきません(間違っているかもしれません)。
単位の問題なのかと思っていますが、きちっと各項目間(空白1文字分)のセンターに罫線を引くにはどうしたらよいでしょうか?

また、pictureboxでの文字指定はフォントサイズが指定できるようですが行間の指定ができません。
基本問題ないのですが、これですと天地の項目間も罫線で切り分ける場合には行間も計算しなければなず、行間が不明なので困ってしまっています。
文字と文字の行間はどのように計算したらよいでしょうか。

質問は以上2点です。初心者ですので、詰まって先へ進めません。どうかお解りになる方、ご教示願います。



            List<string> HList = new List<string>();

               HList.Add("00-0000-0001 みかん 愛媛 ●○○○○●○○○○● ○○○○●○○○○●");
               HList.Add("00-0000-0002 リンゴ 青森 ●○○○○●○○○○● ○○○○●○○○○●");
               HList.Add("00-0000-0003 ブドウ 山梨 ●○○○○●○○○○● ○○○○●○○○○●");

               int P = 10;  //全角文字1文字分で10ポイント

           string Lstr=string.Join("\r\n", HList);
           Bitmap canv = new Bitmap(pictureBox1.Width, pictureBox1.Height);
           Graphics g = Graphics.FromImage(canv);
           g.PageUnit = GraphicsUnit.Point;

           string drawString = @Lstr;
           Font fnt = new Font("MS ゴシック", P);
           RectangleF rect = new RectangleF(0, 0, 1500, 500);
           g.FillRectangle(Brushes.White, rect);
           g.DrawString(drawString, fnt, Brushes.Black, rect);


            
            Pen pen = new Pen(Color.Blue);
            int[] ColLine = { 6, 3, 2, 10, 10 };   //先頭の6は文字が半角のためです。
            int cx = 0;

            for (int i = 0; ColLine.Length - 1 >= i; i++)
            {
                cx += (ColLine[i]*P) + (P / 2);

                g.DrawLine(pen, (cx) , 0, (cx) , 100);
 
            }

           fnt.Dispose();
           g.Dispose();

           pictureBox1.Image = canv;

引用返信 編集キー/
■65347 / inTopicNo.2)  Re[1]: pictureboxへの文字罫線の描画について
□投稿者/ shu (195回)-(2013/02/19(Tue) 12:02:45)
2013/02/19(Tue) 12:06:25 編集(投稿者)

No65346 (まなか さん) に返信

cx はintではなくfloatのほうがよいです。

また固定で処理せず
MeasureStringなどで文字列の計測をした方が確実です。
http://dobon.net/vb/dotnet/graphics/measurestring.html
引用返信 編集キー/
■65357 / inTopicNo.3)  Re[1]: pictureboxへの文字罫線の描画について
□投稿者/ Jitta (32回)-(2013/02/19(Tue) 22:15:56)
Jitta さんの Web サイト
No65346 (まなか さん) に返信
> きちっと各項目間(空白1文字分)のセンターに罫線を引くにはどうしたらよいでしょうか?
惜しい!!検算しましょう。

> for (int i = 0; ColLine.Length - 1 >= i; i++)
このループの中で、cx はどの様に変化しますか?
1回目
cx = 0 + (6 * 10) + (10 / 2) → 0 + 60 + 5 → 65
2回目
cx = 65 + (3 * 10) + (10 / 2) → 65 + 30 + 5 → 100
3回目
cx = 100 + (2 * 10) + (10 / 2) → 100 + 20 + 5 → 125
・・・

これに対して、実際に欲しい値は、どうでしょうか。
1回目
cx = 全角6文字分 + 半角1つ分 → 65
2回目
cx = 全角10文字分(6+1+3) + 半角1つ分 → 105
3回目
cx = 全角13文字分(6+1+3+1+2) + 半角1つ分 → 135

この様に、罫線を引いた「p / 2」を、1つ分として数え直さなければならない、ということです。
半分しか足していないので、1項目増える毎に半分ずつ左に寄っていきます。


 行間の方は、改行コードで繋げずに、1行ずつ書くようにすれば、どうとでも出来ますよね。

引用返信 編集キー/
■65373 / inTopicNo.4)  Re[2]: pictureboxへの文字罫線の描画について
□投稿者/ ??肩 (1回)-(2013/02/21(Thu) 09:25:54)
>shuさん
ありがとうございまいました。
リンク先の情報を読んで、理解しました。

各要素を配列に代入して、そこから要素ごとに幅、高さをとって、処理することで解決できそうです。
どうもありがとうございました。

>Jittaさん
ご指摘ありがとうございました。
確かに数値の計算式間違えておりました。
掲示板投稿用に取り急ぎコーディングしたため、間違えてしまいました(実際のコードはもっと複雑で解りにくかったため)。

以後気をつけます。

ですが、残念ですが、正しい数値をとっても、やはり誤差の為か罫線が文字にかかってしまうようでした。

本問題は先の、shuさんの内容で解決できそうです。

上記要領で作成したpictureboxのデータをプリントに送って印刷したいというモノなのですが、新たな壁にぶち当たりました。
そちらは、新たに質問を立ち上げたいと思います。

ありがとうございました。
解決済み
引用返信 編集キー/
■65378 / inTopicNo.5)  Re[3]: pictureboxへの文字罫線の描画について
□投稿者/ まなか (2回)-(2013/02/21(Thu) 11:40:13)
↑名前がへんになりました。すみませんまなかです。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -