.NET用ラバーバンドクラス

C#でツール作るたび毎回毎回ラバーバンドで苦労してる気がしてきたので、クラスにまとめて使い回そうともくろんでみたり。

説明とかめんどくさいのでソース見てください。動作サンプルもつけてます。VisualStudio2012用になってますが自力でソリューション作り直せばVS2010でも.NET 4.5以前でもイケるんじゃないでしょうか(少なくともライブラリの方は)。

ピクチャボックス pictureBox1 をフォーム Form1 に置いてるものとして、
下記のようなコードで動かします。

public partial class Form1 : Form
{
    DNASoftwares.Rubberband rub;

    public Form1()
    {
        InitializeComponent();
        //新しいインスタンスの作成。引数は矩形初期値、ハンドルをつける場所、可動範囲の順
        rub = new DNASoftwares.Rubberband(new Rectangle(100, 100, 250, 250),
            DNASoftwares.Rubberband.HandlePosition.All,
            new Rectangle(Point.Empty, pictureBox1.ClientSize));
        toolStripComboBox1.SelectedIndex = 1;
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        //基本こんな感じで、if(メソッド) コンテナ.Refresh(); とすればいいです。
        //MouseDown イベントでは MouseDownEvent メソッドを呼びます
        if(rub.MouseDownEvent(e)) pictureBox1.Refresh();
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        Cursor c;
        //MouseMove イベントでは MouseMoveEvent メソッドを呼びます
        if (rub.MouseMoveEvent(e, out c)) pictureBox1.Refresh();
        // MouseMoveEvent は ラバーバンド上でのカーソル変更も支援できます。
        pictureBox1.Cursor = c;
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        //MouseUp イベントでは MouseUpEvent メソッドを呼びます
        if(rub.MouseUpEvent(e)) pictureBox1.Refresh();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor),e.ClipRectangle);
        //Paint イベントでは PaintEvent メソッドを呼びます。背景クリア等は各自。
        rub.PaintEvent(e);
    }

// 以下省略