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

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

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

Re[2]: 角丸の四角形を描画したい


(過去ログ 127 を表示中)

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

■75823 / inTopicNo.1)  角丸の四角形を描画したい
  
□投稿者/ よぽん (13回)-(2015/05/07(Thu) 15:19:55)

分類:[.NET 全般] 

角が丸くならないです。
角を丸くする方法を教えてください。

Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
Graphics g = Graphics.FromImage(canvas);

Pen blackPen = new Pen(Color.Black, 1);

blackPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
g.DrawRectangle(blackPen, new Rectangle(70, 10, 40, 40));

blackPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Miter;
g.DrawRectangle(blackPen, new Rectangle(130, 10, 40, 40));

blackPen.LineJoin = System.Drawing.Drawing2D.LineJoin.MiterClipped;
g.DrawRectangle(blackPen, new Rectangle(190, 10, 40, 40));

blackPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
g.DrawRectangle(blackPen, new Rectangle(250, 10, 40, 40));

blackPen.Dispose();
g.Dispose();
PictureBox1.Image = canvas;
引用返信 編集キー/
■75824 / inTopicNo.2)  Re[1]: 角丸の四角形を描画したい
□投稿者/ 魔界の仮面弁士 (307回)-(2015/05/07(Thu) 15:45:46)
No75823 (よぽん さん) に返信
> Graphics g = Graphics.FromImage(canvas);
g.SmoothingMode は None のままなのですね?


> 角が丸くならないです。
> Pen blackPen = new Pen(Color.Black, 1);

ペンの太さを 10 倍にしてみましょう。


> 角を丸くする方法を教えてください。
GraphicsPath を用いた方が良いかも。
https://msdn.microsoft.com/ja-jp/library/cc440865.aspx
引用返信 編集キー/
■75825 / inTopicNo.3)  Re[1]: 角丸の四角形を描画したい
□投稿者/ shu (740回)-(2015/05/07(Thu) 15:55:39)
No75823 (よぽん さん) に返信

http://dobon.net/vb/dotnet/graphics/linejoin.html
ここのソースを直したものと思われますが
ここのはPenの太さが10なので実現できていますが
1に変更してしまっては駄目です。

1で描画するとしたら
┏━ ────── ━┓
┃         ┃

│          │
│          │

┃         ┃
┗━ ────── ━┛
のように8つのパーツに分けて太い部分をDrawArcで円弧を描画し
細い部分をDrawLineで線を引くような感じになります。

引用返信 編集キー/
■75826 / inTopicNo.4)  Re[2]: 角丸の四角形を描画したい
□投稿者/ 魔界の仮面弁士 (308回)-(2015/05/07(Thu) 16:39:20)
No75824 (魔界の仮面弁士) に追記
>>角を丸くする方法を教えてください。

サンプル:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
  TrackBar tb;
  PictureBox pb;
  public Form1()
  {
   InitializeComponent();

   this.tb = new TrackBar();
   this.tb.Dock = DockStyle.Top;
   this.tb.Minimum = 0;
   this.tb.Maximum = 100;
   this.tb.Value = 20;

   this.pb = new PictureBox();
   this.pb.Dock = DockStyle.Fill;
   this.pb.BorderStyle = BorderStyle.Fixed3D;
   this.pb.Padding = new Padding(8);

   this.Controls.Add(this.pb);
   this.Controls.Add(this.tb);

   this.pb.Paint += this.pb_Paint;
   this.tb.ValueChanged += delegate { this.pb.Invalidate(); };
   this.Resize += delegate { this.pb.Invalidate(); };

   this.MinimumSize = new Size(100, 200);
  }


  void pb_Paint(object sender, PaintEventArgs e)
  {
   Rectangle rc = new Rectangle(
        this.pb.Padding.Left,
        this.pb.Padding.Top,
        this.pb.ClientSize.Width - this.pb.Padding.Horizontal,
        this.pb.ClientSize.Height - this.pb.Padding.Vertical);
   Size sz = new Size(this.tb.Value, this.tb.Value);

   using(Pen pen = new Pen(Color.Black, 1))
    {
    FillRoundedRectangle(e.Graphics, pen, rc, sz);
   }
  }

  void FillRoundedRectangle(Graphics g, Pen pen, Rectangle rect, Size size)
  {
   SmoothingMode sm = g.SmoothingMode;
   PixelOffsetMode pom = g.PixelOffsetMode;
   try
   {
    // 任意のレンダリング品質
    g.SmoothingMode = SmoothingMode.None;
    g.PixelOffsetMode = PixelOffsetMode.None;

    using (GraphicsPath gp = new GraphicsPath())
    {
     gp.FillMode = FillMode.Winding;
     if (size.Height > 0 && size.Width > 0)
     {
      // 角丸四角形
      gp.AddArc(rect.Right - size.Width, rect.Top, size.Width, size.Height, 270, 90);
      gp.AddArc(rect.Right - size.Width, rect.Bottom - size.Height, size.Width, size.Height, 0, 90);
      gp.AddArc(rect.Left, rect.Bottom - size.Height, size.Width, size.Height, 90, 90);
      gp.AddArc(rect.Left, rect.Top, size.Width, size.Height, 180, 90);
      gp.AddArc(rect.Right - size.Width, rect.Top, size.Width, size.Height, 270, 90);
     }
     else
     {
      // 通常の四角形
      gp.AddRectangle(rect);
     }
     g.DrawPath(pen, gp);
    }
   }
   finally
   {
    g.SmoothingMode = sm;
    g.PixelOffsetMode = pom;
   }
  }
 }
}

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -