C#|テキストボックス上でのD&Dでフォームを移動する

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プロパティの境界外を参照して例外が発生していたので修正した。

※気が変わったので違うロジックでゴッソリと書き換えた。

C#|テキストボックス上でのD&Dでフォームを移動する」への3件のフィードバック

  1. 60;  &#160 みたいになってて読めない・・・・orz。
    表示する文字コード換えても変わりません。

    1. 報告ありがとうございます。記事の内容が壊れていたので修正しました。そちらのキャッシュはこの記事のものではなく以下ページのものです。私自身、もう両実装の詳細な違いや意図を覚えていないのですが、以下ページの実装の方がこの記事の実装よりも色々考慮されていそうです。
      http://anis774.net/codevault/danddmovetextbox.html

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください