Winform控件Button及控件的鼠标事件介绍

简介: 按钮控件是最常用的,用于实现点击完成操作。其主要处理的就是鼠标点击Click事件。由此可以引发出所有与鼠标有关的事件.....

按钮控件是最常用的,用于实现点击完成操作。其主要处理的就是鼠标点击Click事件。由此可以引发出所有与鼠标有关的事件。

Button控件

直接从工具箱拖动Button到Form窗体,名字为Btn

然后再添加一个Label控件(msgLabel)用于显示消息,“清理消息”按钮(button1)清除显示的消息

在Form的构造函数中,进行一些控件相关的初始化操作。

public Form1()
{
    InitializeComponent();

    msgLabel.ForeColor = Color.White;
    msgLabel.BackColor = Color.MediumPurple;

    var font =new Font(msgLabel.Font.FontFamily,msgLabel.Font.Size+1,msgLabel.Font.Style);
    msgLabel.Font = font;

    // Button的Click和MouseClick只支持鼠标左键触发;如要区分鼠标右键、中间键等事件,参考Mouse相关事件
    btn.Click += Btn_Click;
    btn.MouseClick += Btn_MouseClick;

}

运行后如下:

添加Btn的Click和MouseClick事件方法、和清除消息的点击事件

private void Btn_Click(object sender, EventArgs e)
{
    msgLabel.Text += "Button的Click事件;";
}

private void Btn_MouseClick(object sender, MouseEventArgs e)
{
    msgLabel.Text += "Button的MouseClick事件;";

}

private void button1_Click(object sender, EventArgs e)
{
    msgLabel.Text = "";
}

点击Btn可以看到:Button的Click和MouseClick只支持鼠标左键触发;如要区分鼠标右键、中间键等情况,需要参考使用Mouse其他的相关事件

Click和MouseClick事件

为了进一步了解,我们添加Lable和Form的Click、MouseClick事件

// 除Button外,其他控件(包括Form)的Click、MouseClick事件都可以由鼠标的任意键触发
// MouseClick即鼠标事件(所有的鼠标事件)参数都包含鼠标的属性,用于获取位置、哪个键等
// Click的事件参数可以转换为MouseEventArgs,从而获取更多信息(一般就直接使用MouseClick了)
// 先触发Click,再触发MouseClick
msgLabel.Click += MsgLabel_Click;
msgLabel.MouseClick += MsgLabel_MouseClick;

Click += Form1_Click;
MouseClick += Form1_MouseClick;

事件方法如下:

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    msgLabel.Text += "窗体的MouseClick事件;";
}

private void Form1_Click(object sender, EventArgs e)
{
    msgLabel.Text += "窗体的Click事件;";
    // CLick事件中可以将事件参数EventArgs转换为MouseEventArgs类型
    var me = (MouseEventArgs)e;
    
}

private void MsgLabel_MouseClick(object sender, MouseEventArgs e)
{
    msgLabel.Text += "MsgLabel的MouseClick事件;";
}

private void MsgLabel_Click(object sender, EventArgs e)
{
    msgLabel.Text += "MsgLabel的Click事件;";
}

可以分别进行点击测试。

除Button外,其他控件(包括Form)的Click、MouseClick事件都可以由鼠标的任意键触发。

MouseClick鼠标事件(所有的鼠标事件)参数都包含鼠标的属性,用于获取位置、哪个键等。

Click的事件参数可以转换为MouseEventArgs,从而获取更多信息(一般就直接使用MouseClick了)

事件顺序是先触发Click,再触发MouseClick

鼠标相关事件(鼠标Enter、Hover、Move、Down、Up、Leave等)

除了下面几种,还有 MouseDoubleClick、MouseWheel、MouseCaptureChanged等,具体区别可直接测试

//鼠标事件
btn.MouseEnter += Btn_MouseEnter;
btn.MouseHover += Btn_MouseHover;
btn.MouseMove += Btn_MouseMove;
btn.MouseDown += Btn_MouseDown;
btn.MouseUp += Btn_MouseUp;
btn.MouseLeave += Btn_MouseLeave;
private void Btn_MouseUp(object sender, MouseEventArgs e)
{
    msgLabel.Text += "Button的MouseUp事件;";
}

private void Btn_MouseDown(object sender, MouseEventArgs e)
{
    msgLabel.Text += "Button的MouseDown事件;";
}

private void Btn_MouseMove(object sender, MouseEventArgs e)
{
    if (!msgLabel.Text.Contains("MouseMove"))
    {
        msgLabel.Text += "Button的MouseMove鼠标在按钮上移动事件;";
    }
}

private void Btn_MouseHover(object sender, EventArgs e)
{
    if (!msgLabel.Text.Contains("MouseHover"))
    {
        msgLabel.Text += "Button的MouseHover事件;";
    }
}

private void Btn_MouseEnter(object sender, EventArgs e)
{
    btn.BackColor = Color.Moccasin;
    msgLabel.Text += "Button的MouseEnter事件;";
}

private void Btn_MouseLeave(object sender, EventArgs e)
{
    btn.BackColor = SystemColors.Control;
    msgLabel.Text += "Button的MouseLeave事件;";
}

从消息提示上可以清楚的看到事件执行顺序及触发条件。

鼠标位置相对于窗体、屏幕的坐标

  • MousePosition : 获取鼠标光标的位置(以屏幕坐标表示)
  • Control.PointToClient(Point):将指定屏幕点的位置计算成工作区坐标
  • Control.PointToScreen(Point):将指定工作区点的位置计算成屏幕坐标。

如下是几个计算控件坐标、屏幕坐标的示例

Point screenPoint = Control.MousePosition;// 或直接MousePosition。鼠标相对于屏幕左上角的坐标
Point formPoint = this.PointToClient(Control.MousePosition);//鼠标相对于窗体左上角的坐标

Point btnPoint= btn.PointToClient(Control.MousePosition); //鼠标相对于btn(Button)左上角的坐标
Point btnScreenPotion = PointToScreen(new Point(btn.Left, btn.Top));// Button控件在屏幕坐标的位置

在窗体的MouseMove事件中,获取鼠标对于Form和Screen的坐标。

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    Text = $"鼠标的屏幕坐标:{MousePosition};鼠标的窗体坐标:{PointToClient(MousePosition)}";
}

MouseCaptureChanged事件及其发生顺序

鼠标按下抬起时完整的事件顺序为:

  1. MouseDown
  2. MouseUp
  3. MouseCaptureChanged

当鼠标按下的同时,键盘按下 Alt+Tab 切换到另一个程序,这将触发MouseCaptureChanged事件,但是可能不会引发MouseUp。【按下Windows键或Ctrl+Esc也可进行测试,或者其他程序弹出窗口,使失去焦点】。此时发生的事件为:

  1. MouseDown
  2. MouseCaptureChanged
相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
7759 0
Winform控件优化之TabControl控件的使用和常用功能
|
开发工具 git
【git 实用指南】git 上传代码
【git 实用指南】git 上传代码
327 2
|
10月前
|
关系型数据库 分布式数据库 数据库
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
208 1
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
1190 1
|
消息中间件 存储 Kafka
面试题:Kafka如何保证高可用?有图有真相
面试题:Kafka如何保证高可用?有图有真相
366 0
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
679 0
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
1360 1
|
算法 安全 Java
【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解
296 1
|
安全 程序员 编译器
【C++】继承(定义、菱形继承、虚拟继承)
【C++】继承(定义、菱形继承、虚拟继承)
204 1
|
机器学习/深度学习
技术经验分享:HTML转义字符大全
技术经验分享:HTML转义字符大全
577 0