C#中WinForm控件的拖动和缩放的实现代码

下面就为你详细讲解一下“C#中WinForm控件的拖动和缩放的实现代码”的完整攻略。

拖动实现代码

在C#中实现控件的拖动,可以通过以下步骤来进行:

  1. 设置鼠标事件

在控件中添加 MouseDownMouseMove 事件,分别用于鼠标按下和鼠标移动的操作。

private Point mouseOffset;
private bool isDragging = false;

private void panel1_MouseDown(object sender, MouseEventArgs e)     
{
    int xOffset = -e.X;
    int yOffset = -e.Y;
    mouseOffset = new Point(xOffset, yOffset);
    isDragging = true;
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (isDragging)
    {
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        this.Location = mousePos;
    }
}
  1. 实现拖动

在鼠标按下事件中获取鼠标点击位置与窗口或控件的边框之间的偏移(用 mouseOffset 存储)。当鼠标移动时,根据鼠标相对于控件的位置偏移和鼠标移动的位置,计算控件应该移动到的新位置,并使用this.Location来更新控件位置。

缩放实现代码

在C#中实现控件的缩放,可以通过以下步骤来进行:

  1. 设置鼠标事件

在控件中添加 MouseDownMouseMove 事件,分别用于鼠标按下和鼠标移动的操作。

private const int wmNcHitTest = 0x84;

private const int htLeft = 10;
private const int htRight = 11;
private const int htTop = 12;
private const int htTopLeft = 13;
private const int htTopRight = 14;
private const int htBottom = 15;
private const int htBottomLeft = 16;
private const int htBottomRight = 17;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == wmNcHitTest)
    {
        Point point = new Point((int)m.LParam);
        point = this.PointToClient(point);

        if (point.X <= this.Size.Width / 2)
        {
            if (point.Y <= this.Size.Height / 2)
            {
                m.Result = (IntPtr)htTopLeft;
            }
            else
            {
                m.Result = (IntPtr)htBottomLeft;
            }
        }
        else
        {
            if (point.Y <= this.Size.Height / 2)
            {
                m.Result = (IntPtr)htTopRight;
            }
            else
            {
                m.Result = (IntPtr)htBottomRight;
            }
        }
    }
}

private void panel1_MouseDown(object sender, MouseEventArgs e)     
{
    int xOffset = -e.X;
    int yOffset = -e.Y;
    mouseOffset = new Point(xOffset, yOffset);
    isResizing = true;
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (isResizing)
    {
        Point newSize = new Point(panel1.Size.Width + e.X - mouseOffset.X, panel1.Size.Height + e.Y - mouseOffset.Y);

        if (newSize.X > 0 && newSize.Y > 0)
        {
            panel1.Size = newSize;
        }
    }
}
  1. 实现缩放

在控件中处理 WndProc 消息,并获取鼠标相对于窗口边框的位置,根据位置不同返回不同的拖放命令。在鼠标按下事件中获取鼠标点击位置与控件大小之间的偏移(用 mouseOffset 存储)。当鼠标移动时,根据鼠标相对于控件的位置偏移和鼠标移动的位置,计算控件应该缩放到的新大小,并使用this.Size来更新控件大小。

示例说明

这里提供两个示例,一个实现了拖拽效果,一个实现了缩放效果:

示例1:拖拽效果的实现

在这个示例中,我们以 panel1 控件为例,实现它可以通过鼠标拖拽的方式移动。

  1. panel1 控件添加到窗口中。
  2. panel1MouseDown 事件与 panel1_MouseDown 方法绑定,将 panel1MouseMove 事件与 panel1_MouseMove 方法绑定。
  3. 处理 panel1_MouseDown 事件,获取鼠标点击位置与 panel1 的边框之间的偏移(用 mouseOffset 存储),并设置 isDraggingtrue
  4. 处理 panel1_MouseMove 事件,计算 panel1 应该移动到的新位置,并使用 this.Location 来更新 panel1 位置。

示例代码如下:

public partial class Form1 : Form
{
    private Point mouseOffset;
    private bool isDragging = false;

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        int xOffset = -e.X;
        int yOffset = -e.Y;
        mouseOffset = new Point(xOffset, yOffset);
        isDragging = true;
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragging)
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            this.Location = mousePos;
        }
    }
}

示例2:缩放效果的实现

在这个示例中,我们以 panel1 控件为例,实现它可以通过鼠标缩放的方式改变大小。

  1. panel1 控件添加到窗口中。
  2. 处理 WndProc 消息,并获取鼠标相对于窗口边框的位置,根据位置不同返回不同的拖放命令。
  3. panel1MouseDown 事件与 panel1_MouseDown 方法绑定,将 panel1MouseMove 事件与 panel1_MouseMove 方法绑定。
  4. 处理 panel1_MouseDown 事件,获取鼠标点击位置与 panel1 大小之间的偏移(用 mouseOffset 存储),并设置 isResizingtrue
  5. 处理 panel1_MouseMove 事件,计算 panel1 应该缩放到的新大小,并使用 this.Size 来更新 panel1 大小。

示例代码如下:

public partial class Form1 : Form
{
    private const int wmNcHitTest = 0x84;

    private const int htLeft = 10;
    private const int htRight = 11;
    private const int htTop = 12;
    private const int htTopLeft = 13;
    private const int htTopRight = 14;
    private const int htBottom = 15;
    private const int htBottomLeft = 16;
    private const int htBottomRight = 17;

    private Point mouseOffset;
    private bool isResizing = false;

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == wmNcHitTest)
        {
            Point point = new Point((int)m.LParam);
            point = this.PointToClient(point);

            if (point.X <= this.Size.Width / 2)
            {
                if (point.Y <= this.Size.Height / 2)
                {
                    m.Result = (IntPtr)htTopLeft;
                }
                else
                {
                    m.Result = (IntPtr)htBottomLeft;
                }
            }
            else
            {
                if (point.Y <= this.Size.Height / 2)
                {
                    m.Result = (IntPtr)htTopRight;
                }
                else
                {
                    m.Result = (IntPtr)htBottomRight;
                }
            }
        }
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        int xOffset = -e.X;
        int yOffset = -e.Y;
        mouseOffset = new Point(xOffset, yOffset);
        isResizing = true;
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isResizing)
        {
            Point newSize = new Point(panel1.Size.Width + e.X - mouseOffset.X, panel1.Size.Height + e.Y - mouseOffset.Y);

            if (newSize.X > 0 && newSize.Y > 0)
            {
                panel1.Size = newSize;
            }
        }
    }
}

希望以上内容能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中WinForm控件的拖动和缩放的实现代码 - Python技术站

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

相关文章

  • soa框架

    SOA框架:服务导向的架构流行趋势 在信息技术领域中,业务系统采用SOA(面向服务架构)框架构建愈发流行。SOA框架提供了在不同网络环境下弹性、安全、可扩展服务的集成途径。本文将深入探究SOA框架的含义、特点以及优势,同时也描述了它在现代应用开发中的广泛应用。 SOA框架的含义 面向服务的框架(SOA)在架构设计方面是一种横切关注点(cross-cuttin…

    其他 2023年3月29日
    00
  • 这些开源的oa协同办公系统 真的免费又好用!

    这些开源的OA协同办公系统真的免费又好用! 随着互联网的发展,越来越多的企业开始使用OA协同办公系统来提高工作效率和管理效率。而开源的OA同办公系统不仅免费,且强大,可以满足大部分企业的需求。本文将介绍几款开源的OA同办公系统,并提供两示例说明以帮助您更好地了解和应用这些系统。 1. 开源OA 开OA是一款基于Web的OA协同办系统,支持多语言、多平台、多数…

    other 2023年5月7日
    00
  • Apache服务器中.htaccess文件的实用配置示例集锦

    Apache服务器中.htaccess文件的实用配置示例集锦 .htaccess文件是Apache服务器中用于配置网站的重要文件之一。它可以用来修改服务器的行为,实现各种功能和安全性设置。下面是一些常见的实用配置示例,帮助你更好地理解和使用.htaccess文件。 1. 重定向URL 有时候我们需要将某个URL重定向到另一个URL,可以使用.htaccess…

    other 2023年8月5日
    00
  • 谷歌开发者工具network:disablecache和preservelog

    当我们使用谷歌开发者工具进行网页调试时,有时需要禁用缓存或保留日志信息。在本攻略中,我们将介绍如何使用谷歌开发者工具的network:disablecache和preservelog功能,并提供两个示例说明。 禁用缓存 禁用缓存可以确保每次请求都是最新的数据,而不是从缓存中获取旧数据。以下是禁用缓存的步骤: 打开谷歌开发者工具。 在Chrome浏览器中,可以…

    other 2023年5月9日
    00
  • vue3封装ECharts组件详解

    Vue3封装ECharts组件详解 前言 ECharts是一个非常流行的可视化图表库,它提供了丰富的图表类型和灵活的配置选项,满足了各种数据展示的需求。本文主要介绍如何在Vue3中封装ECharts组件。 准备工作 在使用ECharts之前,需要先安装echarts库。 npm install echarts@^5.1.0 我们还需要安装@vueuse/co…

    other 2023年6月25日
    00
  • linuxbridge

    Linux Bridge 完整攻略 Linux Bridge 是 Linux 内核中的一个网络设备,它可以将多个网络接口连接在一起,形成一个虚拟的交换机。在本攻略,我们将详细讲解如何使用 Linux Bridge 进行网络配置,并提供两个示例说明。 安装 Linux Bridge 在 Ubuntu 系统中,使用以下命令安装 Linux Bridge: sud…

    other 2023年5月8日
    00
  • 8个实用的svg工具 20个有用的svg工具 五款超实用的开源库

    8个实用的SVG工具 1. Inkscape Inkscape是一款免费的开源矢量图形编辑器,支持SVG格式。它提供了许多有用的工具和功能,例如路径编辑、图形变换、文本编辑、颜色选择器等。Inkscape还支持导入和导出其他矢量图形格式,如EPS、PDFAI等。 2. Adobe Illustrator Adobe Illustrator是一款商业矢量图形编…

    other 2023年5月9日
    00
  • 用js实现ajax请求

    以下是使用JavaScript实现AJAX请求的完整攻略: 第1章:概述 AJAX(Asynchronous JavaScript and XML)是一种用于在不重新加载整个页面的情况下更新部分页面的技术。AJAX使用JavaScript和XMLHttpRequest对象来实现异步通信。在使用AJAX时,可以向服务器发送请求并接收响应,而无需刷新整个页面。 …

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部