エクスプローラや画像処理ソフトでよくある、マウスで選択した領域を四角で囲むというイメージです。


ソース

ソースは以下のようになります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SelectRegion
{
    public partial class Form1 : Form
    {
        Point MD = new Point();
        Point MU = new Point();
        Bitmap bmp;
        bool view = false;
        
        public Form1()
        {
            InitializeComponent();

            //描画先とするImageオブジェクトを作成する
            bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            // 描画フラグON
            view = true;
            
            // Mouseを押した座標を記録
            MD.X = e.X;
            MD.Y = e.Y;
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            Point start = new Point();
            Point end = new Point();
            
            // Mouseを離した座標を記録
            MU.X = e.X;
            MU.Y = e.Y;

            //System.Diagnostics.Debug.WriteLine("MouseUp({0},{1})->({2},{3})", MD.X, MD.Y, MU.X, MU.Y);
            
            // 座標から(X,Y)座標を計算
            GetRegion(MD, MU, ref start, ref end);
            
            // 領域を描画
            DrawRegion(start, end);
            
            //PictureBox1に表示する
            pictureBox1.Image = bmp;

            // 描画フラグOFF
            view = false;
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = new Point();
            Point start = new Point();
            Point end = new Point();

            // 描画フラグcheck
            if (view == false)
            {
                return;
            }
            
            // カーソルが示している場所の座標を取得
            p.X = e.X;
            p.Y = e.Y;

            // 座標から(X,Y)座標を計算
            GetRegion(MD, p, ref start, ref end);

            //System.Diagnostics.Debug.WriteLine("Move ({0},{1})", e.X, e.Y);

            // 領域を描画
            DrawRegion(start, end);
            
            //PictureBox1に表示する
            pictureBox1.Image = bmp;
        }

        private void GetRegion(Point p1, Point p2, ref Point start, ref Point end)
        {
            start.X = Math.Min(p1.X, p2.X);
            start.Y = Math.Min(p1.Y, p2.Y);

            end.X = Math.Max(p1.X, p2.X);
            end.Y = Math.Max(p1.Y, p2.Y);
        }

        private int GetLength(int start, int end)
        {
            return Math.Abs(start - end);
        }

        private void DrawRegion(Point start, Point end)
        {
            Pen blackPen = new Pen(Color.Black);
            Graphics g = Graphics.FromImage(bmp);

            // 描画する線を点線に設定
            blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

            // 画面を消去
            g.Clear(SystemColors.Control);
            
            // 領域を描画
            g.DrawRectangle(blackPen, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y));
            
            g.Dispose();
        }
    }
}


【pictureBox1_MouseUp】
マウスをクリックした瞬間にコールされます。
押した瞬間の座標を取得するのと、描画用のフラグをONにしています。

【pictureBox1_MouseDown】
マウスをクリックを離した瞬間にコールされます。
離した場所の座標を取得するのと、描画用のフラグをOFFにしています。

【pictureBox1_MouseMove】
マウスが移動中は常にコールされます。
描画用のフラグがONになっていないと以降の処理をしないようにしています。



個人的にはGetRegionの関数で複数の戻り値ができるよう実装したかったのですが、挫折・・・orz

結果

結果はわかりずらいですが、以下のようになります。


1_20120917192150.png


ドラッグするときちんと四角の領域もマウスに追随していきます。
画像処理のソフトなどで、領域拡大をさせるときにマウスで選択したい場合に視覚的にわかりやすくなるのかなと・・・

Related Entries
Comments
Post a comment
Contributor
Comment
Trackbacks URL
URL
Permalink
Trackbacks
FC2カウンター
プロフィール

詠み人知らず

Author:詠み人知らず
プログラム好きな名もなき凡人がお送りしています。(得意とは言っていない
最近の興味はPython、C#、Matlab(Octave)、画像処理、AR(拡張現実)、統計などなど・・・

気分で思いついたことを書くため話題に一貫性がないかもしれません。

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
タグクラウドとサーチ

カテゴリ
最新コメント
最新トラックバック
月別アーカイブ