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プロパティの境界外を参照して例外が発生していたので修正した。
※気が変わったので違うロジックでゴッソリと書き換えた。
60;   みたいになってて読めない・・・・orz。
表示する文字コード換えても変わりません。
連投すみません。
キャッシュが生きてたんでソッチを読んでます。
http://webcache.googleusercontent.com/search?q=cache:7d4ngUalOCcJ:anis774.net/codevault/danddmovetextbox.html+&cd=1&hl=ja&ct=clnk&gl=jp
キャッシュ側を参考にして修正してくれると助かるんですが(笑)
報告ありがとうございます。記事の内容が壊れていたので修正しました。そちらのキャッシュはこの記事のものではなく以下ページのものです。私自身、もう両実装の詳細な違いや意図を覚えていないのですが、以下ページの実装の方がこの記事の実装よりも色々考慮されていそうです。
http://anis774.net/codevault/danddmovetextbox.html