.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); } // 以下省略