【C#】クライアント領域をドラッグしてフォームを移動する方法


この記事はプロモーションを含みます。

Windowsフォームアプリで、クライアント領域(タイトルバー以外の領域)をドラッグしてフォームを移動させる方法を解説します。

はじめに

WindowsフォームでカスタムUIを作っていると、フォームのタイトルバーを非表示にしたくなることがあります。
しかしそうすると、「ドラッグで移動できない」問題にぶつかります。

今回は、クライアント領域をドラッグしてフォームを移動する方法を紹介します。

ソースコード

以下がソースコードになります。
このコードでは、フォーム全体をドラッグ対象としており、WinAPIを使用して実装しています。

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

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // ウィンドウ移動用のWinAPI
        public const int WM_NCLBUTTONDOWN = 0xA1;
        public const int HTCAPTION = 0x2;

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();

        public Form1()
        {
            InitializeComponent();

            // フォーム全体をドラッグ対象にする
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
            }
        }
    }
}

今回は簡単にフォーム全体をドラッグ出来るようにしていますが、今後はラベルなどのコントロールをドラッグすることでフォームを移動させるような機能などもご紹介していければと思います。

コメント

タイトルとURLをコピーしました