winform实现可拖动的自定义Label控件

下面是实现winform可拖动自定义Label控件的攻略。

准备工作

  1. 新建winform项目,打开Visual Studio。
  2. 添加一个类库项目,用于编写自定义控件。
  3. 在类库项目中添加Winform命名空间,引用该命名空间中的控件。

编写自定义控件

  1. 在类库项目中新建一个类,继承自Label控件。
  2. 重写OnMouseDown、OnMouseMove、OnMouseUp等方法,实现鼠标拖动控件的功能。示例代码如下:
public partial class DraggableLabel : Label
{
    private bool isDragging = false;
    private Point lastLocation;

    public DraggableLabel()
    {
        InitializeComponent();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        if (e.Button == MouseButtons.Left)
        {
            isDragging = true;
            lastLocation = e.Location;
        }
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        if (isDragging)
        {
            this.Left += e.X - lastLocation.X;
            this.Top += e.Y - lastLocation.Y;
        }
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        if (e.Button == MouseButtons.Left)
        {
            isDragging = false;
        }
    }
}

集成自定义控件

  1. 在winform项目中打开设计界面,从工具箱中拖拽自定义控件DrabbableLabel到窗体中。
  2. 在窗体的Load事件中,设置控件的位置、大小、文本等属性。示例代码如下:
private void Form1_Load(object sender, EventArgs e)
{
    DraggableLabel label1 = new DraggableLabel();
    label1.Text = "Hello, World!";
    label1.Location = new Point(100, 100);
    label1.Size = new Size(200, 50);
    this.Controls.Add(label1);

    DraggableLabel label2 = new DraggableLabel();
    label2.Text = "Hello, Winform!";
    label2.Location = new Point(300, 200);
    label2.Size = new Size(200, 50);
    this.Controls.Add(label2);
}

示例说明

示例一

上述代码中,我们编写了一个自定义控件DraggableLabel,继承自Label控件,并添加了鼠标拖动功能。然后在winform窗体的Load事件中,实例化两个自定义控件,并分别设置其位置、大小、文本等属性,添加到窗体中。运行程序后,我们可以使用鼠标左键拖动这些控件。

示例二

在上述示例代码的基础上,我们可以使用多线程实现两个自定义控件同时移动的效果。示例代码如下:

private void Form1_Load(object sender, EventArgs e)
{
    DraggableLabel label1 = new DraggableLabel();
    label1.Text = "Hello, World!";
    label1.Location = new Point(100, 100);
    label1.Size = new Size(200, 50);
    this.Controls.Add(label1);

    DraggableLabel label2 = new DraggableLabel();
    label2.Text = "Hello, Winform!";
    label2.Location = new Point(300, 200);
    label2.Size = new Size(200, 50);
    this.Controls.Add(label2);

    Thread thread1 = new Thread(() =>
    {
        while (true)
        {
            label1.Invoke(new Action(() =>
            {
                label1.Left += 1;
                if (label1.Left > this.ClientSize.Width)
                    label1.Left = 0;
            }));
            Thread.Sleep(10);
        }
    });
    thread1.Start();

    Thread thread2 = new Thread(() =>
    {
        while (true)
        {
            label2.Invoke(new Action(() =>
            {
                label2.Top += 1;
                if (label2.Top > this.ClientSize.Height)
                    label2.Top = 0;
            }));
            Thread.Sleep(10);
        }
    });
    thread2.Start();
}

在上述代码中,我们使用两个线程分别控制两个自定义控件的移动,每隔10毫秒改变自定义控件的位置,实现自定义控件的动态移动效果。运行程序后,我们可以看到自定义控件在窗体中动态移动。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:winform实现可拖动的自定义Label控件 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#使用Process类调用外部程序分解

    使用Process类调用外部程序分解 在C#中,我们可以使用Process类来调用并控制外部程序的运行。常见的用途之一是运行一些命令行程序或工具,以获取额外的功能。 使用Process类调用外部程序 使用Process类的关键步骤如下: 引入命名空间 using System.Diagnostics; 创建Process对象 Process process …

    C# 2023年6月7日
    00
  • C#面向对象编程中依赖反转原则的示例详解

    C#面向对象编程中依赖反转原则的示例详解 什么是依赖反转原则 依赖反转原则(DIP)是面向对象设计的重要原则之一。它的核心是:高层模块不应该依赖低层模块,而是共同依赖于抽象层。换句话说,具体的实现应该依赖于抽象定义。 通过这个原则,我们可以实现两个重要目标: 可替换性:由于高层模块和低层模块都依赖于抽象层,因此可以在满足接口规范的前提下,随时替换实现类。 解…

    C# 2023年6月1日
    00
  • C# PictureBox控件方法参数及图片删除重命名上传详解

    C# PictureBox控件方法参数及图片删除重命名上传详解 控件介绍 PictureBox控件是 C#中非常常用的图片显示控件,可以显示多种图片格式的静态图像和动态图像。 常用方法及参数 PictureBox.ImageLocation 属性 该属性可以指定 PictureBox 控件要显示的图像文件的路径,路径可以是绝对路径,也可以是相对于应用程序包含…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC通过IActionFilter.OnActionExecuting方法,获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器。最近才发现IActionFilter的OnActionExecuting方法,甚至可以获取Controller的Action方法参数值。 假如我们在ASP.NET Core MVC项目中有一个HomeController,其中有一个Acti…

    C# 2023年4月22日
    00
  • 深入理解正则表达式语法知识

    深入理解正则表达式语法知识 正则表达式是一个用于文本匹配和处理的强大工具。在各种编程语言和工具中都有使用正则表达式的需求,因此深入理解其语法知识是非常重要的。 正则表达式基础语法 正则表达式由各种字符和符号组成,用于定义匹配规则,其中的常见符号和含义包括: .:匹配任意单个字符(除了换行符\n) *:匹配0个或多个前面的字符 +:匹配1个或多个前面的字符 ?…

    C# 2023年6月7日
    00
  • C#常用的命名规则汇总

    C#常用的命名规则汇总 在C#中,良好的命名规则对于开发者而言是至关重要的。它可以明确描述代码所实现的功能,提高代码的可读性和可维护性。在本文中,我们将介绍C#中常用的命名规则。 Pascal命名法 Pascal命名法指的是将每个单词的首字母大写的命名方式。比如,定义一个表示学生姓名的变量,可以使用Pascal命名法: string StudentName;…

    C# 2023年5月15日
    00
  • C#利用win32 Api 修改本地系统时间、获取硬盘序列号

    修改本地系统时间 首先需要导入System.Runtime.InteropServices这个命名空间. using System.Runtime.InteropServices; 然后我们通过GetSystemTime方法获取系统时间,再通过SetSystemTime方法修改系统时间. [DllImport("Kernel32.dll"…

    C# 2023年6月1日
    00
  • C#浮点数的表示和基本运算

    C#浮点数是计算机中用于存储非整数数字的数据类型。浮点数的表示与整数不同,因为它需要存储两个部分的信息:一个是数值本身,另一个是小数点的位置。在C#中,浮点数有两种类型:float和double。float占用4个字节,double占用8个字节。 浮点数的表示 在C#中,浮点数的表示采用IEEE 754标准。该标准将浮点数表示为一个符号(正/负)、一个尾数(…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部