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
相关文章
|
Windows
Winform控件优化之背景透明那些事1:Button控件等背景透明
WinForm不支持真正的透明,其控件透明的实现都是背景颜色设置和对应位置的父控件背景相同。 Winform中控件的背景透明只有三种:Button控件的透明、其他控件的透明...
2970 0
Winform控件优化之背景透明那些事1:Button控件等背景透明
|
7月前
|
C# Windows
49.c#:StatusStrip 控件
49.c#:StatusStrip 控件
163 1
49.c#:StatusStrip 控件
|
7月前
|
C#
38.c#:RithTextBox控件
38.c#:RithTextBox控件
77 1
|
7月前
|
C# 开发者 Windows
48.c#:toolstrip控件
48.c#:toolstrip控件
125 1
|
C# Windows
WPF技术之Button控件
WPF(Windows Presentation Foundation)是用于创建 Windows 客户端应用程序的一种技术。在 WPF 中,按钮是常用的控件之一,用于触发某种行为或操作。
291 0
WPF技术之Button控件
|
C#
【WPF】使用Popup控件做浮窗/提示框
原文:【WPF】使用Popup控件做浮窗/提示框 需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作。 效果如下图: 当鼠标移入左上角的【多选显示】框内,出现下面的浮窗(悬浮在原UI之上)。
4477 0
Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
上次实现的自定义的Button功能是用的自定义的Rectangle来实现的,在慢慢的接触了QML之后,发现QML有自己定义的Button
561 0
Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
DataTimePicker控件总结
DataTimePicker控件总结
156 0