C#实现Winform无边框移动的方法

针对“C#实现Winform无边框移动的方法”的完整攻略,以下为详细说明。

1. 隐藏窗体的系统边框

首先,我们需要将窗体的系统边框(TitleBar)隐藏起来,从而实现无边框窗体移动。我们可以通过设置窗体BorderStyle属性为None来实现:

this.FormBorderStyle = FormBorderStyle.None;

2. 实现窗体的拖动移动

接下来,我们需要实现无边框窗体的移动。我们可以通过鼠标的按下、拖动、释放事件来实现:

private Point mouseOffset; // 鼠标移动距离
private bool isMouseDown = false; // 是否按下鼠标

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        mouseOffset = new Point(-e.X, -e.Y);
        isMouseDown = true;
    }
}

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

private void Form_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        isMouseDown = false;
    }
}

在鼠标按下事件中,我们记录下鼠标当前的位置,同时设置isMouseDown为true。在鼠标移动事件中,如果isMouseDown为true,则根据鼠标当前的位置计算出移动距离,进而设置窗体的位置。在鼠标释放事件中,我们将isMouseDown设置为false。

示例说明:

以下是两个示例说明:

示例1 - 窗体移动

public partial class MainForm : Form
{
    private Point mouseOffset; // 鼠标移动距离
    private bool isMouseDown = false; // 是否按下鼠标

    public MainForm()
    {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None; // 隐藏边框
    }

    private void MainForm_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            mouseOffset = new Point(-e.X, -e.Y);
            isMouseDown = true;
        }
    }

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

    private void MainForm_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isMouseDown = false;
        }
    }
}

上述代码在窗体的MouseDown、MouseMove、MouseUp事件中实现了无边框窗体的移动操作。

示例2 - 控件移动

在某些情况下,我们需要让控件(如panel、picturebox等)能够随着鼠标移动而移动,同样可以用上述方式实现。

public partial class MainForm : Form
{
    private Point mouseOffset; // 鼠标移动距离
    private bool isMouseDown = false; // 是否按下鼠标

    public MainForm()
    {
        InitializeComponent();
        this.FormBorderStyle = FormBorderStyle.None; // 隐藏边框
        this.panel1.MouseDown += new MouseEventHandler(Panel1_MouseDown);
        this.panel1.MouseMove += new MouseEventHandler(Panel1_MouseMove);
        this.panel1.MouseUp += new MouseEventHandler(Panel1_MouseUp);
    }

    private void Panel1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            mouseOffset = new Point(-e.X, -e.Y);
            isMouseDown = true;
        }
    }

    private void Panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMouseDown)
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            panel1.Location = panel1.Parent.PointToClient(mousePos);
        }
    }

    private void Panel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isMouseDown = false;
        }
    }
}

上述代码实现了当鼠标拖动panel1控件时,可以随着鼠标移动而移动的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现Winform无边框移动的方法 - Python技术站

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

相关文章

  • C#读取Excel的三种方式以及比较分析

    下面是详细讲解“C#读取Excel的三种方式以及比较分析”的完整攻略。 背景 C#是微软推出的一门基于.NET Framework的编程语言,是广泛使用的企业级编程语言之一。而Excel是改善我们日常工作中的一大利器。 在实际的应用过程中,C#读取Excel文件的需求非常普遍。而为了满足这个需求,我们可以使用三种方式来读取Excel文件,分别是: 1. 使用…

    C# 2023年5月15日
    00
  • (asp.net c#)DropDownList绑定后显示对应的项的两种方法

    下面是详细讲解“(asp.net c#)DropDownList绑定后显示对应的项的两种方法”的攻略: 1. 根据绑定的值选中对应的项 如果绑定的是数据源,可以在数据绑定完成后,通过设置DropDownList的SelectedItem属性,来实现选中对应的项。 “`csharp // 获取数据源 List data = new List{“apple”,…

    C# 2023年5月31日
    00
  • asp.net core 修改默认端口的几种方法

    在ASP.NET Core中,可以通过多种方式修改默认端口。在本攻略中,我们将讨论几种修改默认端口的方法,并提供两个示例说明。 方法一:使用launchSettings.json文件 在ASP.NET Core中,可以使用launchSettings.json文件来配置应用程序的启动设置。以下是使用launchSettings.json文件修改默认端口的步骤…

    C# 2023年5月17日
    00
  • C# CM框架实现多页面管理的实例代码

    以下是详细讲解“C# CM框架实现多页面管理的实例代码”的完整攻略: 1. 什么是C# CM框架 C# CM框架全称是Carsen Management框架,是一种基于Model-View-ViewModel(MVVM)模式开发的移动端框架。它可以帮助开发者快速构建跨平台的移动应用程序。其中,模型(Model)是指应用程序的数据模型,视图(View)是指应用…

    C# 2023年5月31日
    00
  • C#中后台post请求常用的两种方式总结

    C#中后台post请求常用的两种方式总结 在C#后台开发中,我们常常需要使用HTTP请求来和其它服务器进行通信。使用POST请求可以在请求体中携带参数,更适合传输大量数据,因此本文将主要介绍C#中后台post请求常用的两种方式:HttpClient和WebRequest。 HttpClient HttpClient是一个相对简单易用的类库。它的作用是向指定U…

    C# 2023年5月31日
    00
  • 电脑英文缩写大全

    为了让大家更好地了解“电脑英文缩写大全”的完整攻略,我将分为以下几个部分进行讲解: 1. 收集电脑英文缩写 首先,我们需要收集电脑英文缩写。可以从各种渠道去收集,比如: 在网上搜索相关的英文缩写资料; 浏览电脑文章、手册、技术文档等,注意其中使用的缩写; 参考行业内广泛流传的缩写资料,如IEEE 802.11、ISO 9660等。 收集到英文缩写之后,需要对…

    C# 2023年6月8日
    00
  • C#类和结构详解

    C#类和结构详解 什么是类和结构 在C#编程语言中,类和结构都是用来定义数据结构的方式。类和结构都可以定义成员变量、方法和属性。在使用时,类和结构的含义和用途有所不同。 类和结构最大的区别在于,类是引用类型,而结构是值类型。这意味着,类的变量实际上是一个引用,而结构的变量则是实际的数据。 如何定义类和结构 定义类 对于类的定义,需要使用关键字class。类的…

    C# 2023年5月15日
    00
  • C#使用对象序列化类库MessasgePack

    下面就为您详细讲解一下 C# 使用对象序列化类库 MessasgePack 的完整攻略。 MessagePack 简介 MessagePack 是一种高效的二进制序列化格式,它比 JSON、XML 等其他格式更节省存储空间、更快的数据序列化和反序列化速度。它具有跨语言、轻量级、易于使用、可扩展等特点,广泛应用于 Web 应用、移动应用、游戏开发等领域。 为什…

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