マウスで多角形を描く

C# コンピュータ
C#

ソース

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Collections.Generic;

/*
 折れ線を引く
*/

class Program
{
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}

class Form1 : Form
{
    // ピクチャボックスコントロール
    PictureBox picbox = new PictureBox();
    
    // クリック位置
    List<Point> clickPoints = new List<Point>();
    
    // コンストラクタ
    public Form1()
    {
        // 800x600のカラービットマップオブジェクトを生成
        var bitmap = new Bitmap(800, 600, PixelFormat.Format32bppArgb);
        
        // ビットマップをピクチャボックスに割り当て
        picbox.Image = bitmap;
        
        // コントロールをフォームに登録
        this.Controls.Add(picbox);
            
        // イベントを追加
        this.Load += Form1_Load;
        this.Resize += Form1_Resize;
        
        picbox.MouseClick += Picbox_MouseClick;
        picbox.MouseDoubleClick += Picbox_MouseDobuleClick;
        picbox.MouseMove += Picbox_MouseMove;
    }
    
    // フォームロードイベント
    private void Form1_Load(object sender, EventArgs e)
    {
        Form1_Resize(sender, e);
    }
    // フォームリサイズイベント
    private void Form1_Resize(object sender, EventArgs e)
    {
        // コントロールをフォーム一杯に広げる
        picbox.Size = this.ClientSize;
    }
        
    // ピクチャボックス、マウスクリック
    private void Picbox_MouseClick(object sender, MouseEventArgs e)
    {
        //Console.WriteLine("Click X:{0} Y:{1}", e.X, e.Y);
        
        // クリック位置を記憶
        clickPoints.Add(new Point(e.X, e.Y));
        
        
        // ポイントが2点以下の場合戻る
        if (clickPoints.Count < 2)
        {
            return;
        }
        
        // 図形を消す
        picbox.Refresh();
        
        // 折れ線を引く
        using (var g = picbox.CreateGraphics())
        {
            g.DrawLines(Pens.Black, clickPoints.ToArray());
        }
    }
    // ピクチャボックス、ダブルクリック
    private void Picbox_MouseDobuleClick(object sender, MouseEventArgs e)
    {
        // ポイントが3点以下の場合戻る
        if (clickPoints.Count < 2)
        {
            return;
        }
        
        // ビットマップに書き込み
        using (var g = Graphics.FromImage(picbox.Image))
        {
            g.DrawPolygon(Pens.Black, clickPoints.ToArray());
        }
        picbox.Refresh();
        
        // クリック位置クリア
        clickPoints.Clear();
        
    }
    // ピクチャボックス、マウス移動
    private void Picbox_MouseMove(object sender, MouseEventArgs e)
    {
        // ポイントが1点以下の場合戻る
        if (clickPoints.Count < 1)
        {
            return;
        }
        // 図形を消す
        picbox.Refresh();
        
        // 折れ線を引く
        using (var g = picbox.CreateGraphics())
        using (var pen = new Pen(Color.Black, 1))
        {
            if (clickPoints.Count >= 2)
            {
                g.DrawLines(Pens.Black, clickPoints.ToArray());
            }
            
            pen.DashStyle = DashStyle.Dash;
            
            var startPoint = clickPoints[clickPoints.Count-1];
            var endPoint = new Point(e.X, e.Y);
            g.DrawLine(pen, startPoint, endPoint);
        }
        
    }
}

任意のファイル名で保存して、csc.exeでコンパイルしてください。

実行

フォーム上でクリックをするたびに線が引かれます。
ダブルクリックで始点と終点が線が結ばれ多角形が出来上がります。

コメント