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

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

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

縦表示かつ文章の折り返し

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

■94546 / inTopicNo.1)  縦表示かつ文章の折り返し
  
□投稿者/ 紅 (1回)-(2020/04/19(Sun) 22:41:57)

分類:[.NET 全般] 

環境:Windows10、VS2019のC#WinForm

初めましてお世話になります。
縦表示(90度回転)かつ自動で文章を折り返す機能を追加したいと
考えています。
横表示は1行ごとにLabelで対応していましたが、縦表示だと難しく
なりそうだったのでPictureBoxに文章を描画しました。

    private void View(PaintEventArgs e)
        {
            string text1 =  "あい漢字お か書道けこ さしすケボー たちつてと はひふへほ" + 
                            "まみむめもあい漢字お か書道けこ さしすケボー たちつてと" +
                            "はひふへほ まみむめも";
            using (Font font1 = new Font("Arial", 22, FontStyle.Bold, GraphicsUnit.Pixel))
            {
                SizeF size = e.Graphics.MeasureString(text1, font1);
                RectangleF rectF1 = new RectangleF(900, 0, 500, 500);
                e.Graphics.TranslateTransform(0, size.Width);
                e.Graphics.RotateTransform(-90f);
                e.Graphics.DrawString(text1, font1, Brushes.Black, rectF1);
                e.Graphics.DrawRectangle(Pens.White, Rectangle.Round(rectF1));
            }            
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            View(e);
        }

サンプルは想定した動きに見えますが、本当は1行ごとに長さの違
う文章を読み込んでおり――
RectangleF rectF1 = new RectangleF(900, 0, 500, 500);
rectF1は文章の長さによって適切な値に変えられるようにしたいの
ですが、どう計算したらいいか、わからない状況です。
よろしくお願いします。

引用返信 編集キー/
■94549 / inTopicNo.2)  Re[1]: 縦表示かつ文章の折り返し
□投稿者/ 紅 (2回)-(2020/04/20(Mon) 12:58:49)
以下の修正を行い、想定した動きになりました。
90度の回転を行うので――
e.Graphics.TranslateTransform(0, size.Width);
を以下のように修正する必要がありました。
e.Graphics.TranslateTransform(0, size.Height);
それに伴いrectF1のX座標を修正しました。

using (Font font1 = new Font("Arial", 22, FontStyle.Bold, GraphicsUnit.Pixel))
{
    SizeF size = e.Graphics.MeasureString(text1, font1);
        RectangleF rectF1 = new RectangleF(-500, 0, 500, 500);
        e.Graphics.TranslateTransform(0, size.Height);
        e.Graphics.RotateTransform(-90f);
        e.Graphics.DrawString(text1, font1, Brushes.Black, rectF1);
        e.Graphics.DrawRectangle(Pens.White, Rectangle.Round(rectF1));
} 

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

このトピックをツリーで一括表示


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

このトピックに書きこむ