TextBoxコントロール上でのドラッグ&ドロップでフォームを移動させようとした場合、文字列を選択する操作とバッティングしないようにする必要がある。
以下の実装で良い感じに動いた。
Point mouseDownPoint = new Point(); bool dAndDMoveFlag = false; private void textBox1_MouseDown(object sender, MouseEventArgs e) { if(e.Button != MouseButtons.Left) return; mouseDownPoint = e.Location; bool flag = true; int charHeight = TextRenderer.MeasureText("A", this.textBox1.Font).Height; for(int i = 0; i < this.textBox1.Lines.Length; i++) { Point point = new Point(0, i * charHeight); Size size = TextRenderer.MeasureText( this.textBox1.Lines[i], this.textBox1.Font); Rectangle rect = new Rectangle(point, size); if(rect.Contains(e.Location)) { flag = false; break; } } this.dAndDMoveFlag = flag; } private void textBox1_MouseMove(object sender, MouseEventArgs e) { if(dAndDMoveFlag) { Point p = this.Location; p.Offset( new Point(e.X - mouseDownPoint.X, e.Y - mouseDownPoint.Y)); this.Location = p; } } private void textBox1_MouseUp(object sender, MouseEventArgs e) { dAndDMoveFlag = false; }
素早くドラッグ&ドロップしたときに文字が選択されてしまいフォームの移動がキャンセルされるのを回避する為にdAndDMoveFlag(センスねー名前w)でフラグを立てている。
あとはそんなに難しいことしてないと思う。
※textBox1のTextが空の場合にLinesプロパティの境界外を参照して例外が発生していたので修正した。
※気が変わったので違うロジックでゴッソリと書き換えた。