.net 如何在windows窗体上拖动自定义用户控件?

xv8emn3q  于 2023-02-06  发布在  .NET
关注(0)|答案(2)|浏览(195)

我有一个有两个项目在它的sln文件,第一个项目包含一个自定义用户控件继承按钮,第二个项目有一个窗体和一个按钮,当我点击窗体上的按钮,这是一个按钮的自定义用户控件将被添加到窗体,现在我应该能够拖动窗体上的按钮,无论我想在窗体上运行后,如何做。

public partial class buttCustom : Button
{
    public buttCustom()
    {
        InitializeComponent();
    }
}

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

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        this.Controls.Add(buttControl);
    }
}

我应该能够移动图像中绿色自定义按钮移动到任何地方,我想使用鼠标。

db2dz4w8

db2dz4w81#

我认为您可以在自定义用户控件类中添加下面的代码。

[DllImport("user32.DLL", EntryPoint = "ReleaseCapture")]
private extern static void ReleaseCapture();
[DllImport("user32.DLL", EntryPoint = "SendMessage")]
private extern static void SendMessage(System.IntPtr one, int two, int three, int four);

private void CustomCtrl_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(Handle, 0x112, 0xf012, 0);
}

所以结果会是这样的:

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 MyViewer.CustomControls
{

    public partial class CustomCtrl : UserControl
    {
        public string formTitleText
        {
            get { return label1.Text; }
            set { label1.Text = value; }
        }
        public CustomCtrl()
        {
            InitializeComponent();
        }

        [DllImport("user32.DLL", EntryPoint = "ReleaseCapture")]
        private extern static void ReleaseCapture();
        [DllImport("user32.DLL", EntryPoint = "SendMessage")]
        private extern static void SendMessage(System.IntPtr one, int two, int three, int four);

        // Add MouseDown Event
        private void CustomCtrl_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(Handle, 0x112, 0xf012, 0);
        }
    }
}

然后可以添加自定义用户控件,该控件可以从工具箱中拖动到窗体中。

wyyhbhjk

wyyhbhjk2#

Agula Otgonbaatar给出了正确答案,但我使用了这些值

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

我还检查了MouseButton.Left在我的MouseDown处理程序中,所以它应该是:

if (e.Button == MouseButtons.Left)
{
    ReleaseCapture();
    SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}

这对我有用。

相关问题