【C#】ドラッグアンドドロップで移動する【ボタン】

  • このエントリーをはてなブックマークに追加

<今回の目的>

コントロールをドラッグアンドドロップで移動する方法を記載しています。
今回はボタンをドラッグしてマウスのある位置にドロップできるように作成しています。

以下、ソースを記載します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DragDrop
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// ボタンが押されたことを判断する変数
        /// </summary>
        bool mouseDownFlg = false;

        /// <summary>
        /// 初期表示イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // ボタンコントロールを生成
            Button btnDrag = new Button();
            btnDrag.Text = "ドラッグしてね";
            btnDrag.AllowDrop = true; // 必ず追加する必要があります。
            btnDrag.MouseDown += btnDrag_MouseDown;
            btnDrag.MouseMove += btnDrag_MouseMove;
            btnDrag.DragEnter += btnDrag_DragEnter;
            btnDrag.DragOver += btnDrag_DragOver;
            btnDrag.DragDrop += btnDrag_DragDrop;
            this.Controls.Add(btnDrag);
        }

        /// <summary>
        /// ボタンの上でマウスが押された時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDrag_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                mouseDownFlg = true;
        }

        /// <summary>
        /// ボタンの上でマウスが移動された時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDrag_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseDownFlg)
            {
                Button btnDrag = (Button)sender;
                // ドラッグドロップイベントの開始
                btnDrag.DoDragDrop(sender, DragDropEffects.All);
                mouseDownFlg = false;
            }
        }

        /// <summary>
        /// ドラッグ開始時に発生するイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDrag_DragEnter(object sender, DragEventArgs e)
        {
            // 移動エフェクトを設定
            e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// ドラッグドロップ操作中にマウスが移動された時に発生するイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDrag_DragOver(object sender, DragEventArgs e)
        {
            Button btnDrag = (Button)sender;
            // マウスカーソルの位置にボタンを配置する
            btnDrag.Location = PointToClient(new Point(e.X - btnDrag.Width / 2, e.Y - btnDrag.Height / 2));
        }

        /// <summary>
        /// ドラッグドロップした時に発生するイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDrag_DragDrop(object sender, DragEventArgs e)
        {
            // 初期エフェクトを設定
            e.Effect = DragDropEffects.None;
        }
    }
}