详解C#鼠标事件的处理机制

开发 后端
这里将详细介绍C#鼠标事件的处理机制,毕竟C#不是C++/MFC,那么如何用C#处理鼠标事件呢?本文希望能对大家有所帮助。
C#鼠标事件包括鼠标的很多操作,比如为用户提供鼠标的右键单击功能、右键拖拽等等。处理C#鼠标事件比较简单,只要设置好属性,点击右键就会出现菜单,进一步右键拖拽就涉及到时间处理。

过去用C++/MFC开发程序时,常常为用户提供鼠标的右键单击功能,如今在.NET框架中使用C#,也想在程序中提供鼠标右键单击功能,比如,在文本框、窗格、标签以及主窗口背景上使用鼠标右键。毕竟C#不是C++/MFC,那么如何处理C#鼠标事件呢?本文下面将专门探讨这个问题。

在.NET框架下编程是非常容易的一件事情,有时候容易得连C++程序员想都想不到。这主要是因为用C++编写代码常常需要“硬工夫”。所谓“硬工夫”,也就是很多细节都要自己考虑和处理。但使用C#则不然。如果你想显示上下文菜单,完全没有必要去和事件参合。只要设置控制的ContextMenu属性即可,就象下面这样:

  1. ContextMenu myContextMenu = ...  
  2. myControl.ContextMenu = myContextMenu;   

就这么简单。只要按照上述方法设置好属性,当用户单击右键时,菜单便会自动显示出来。此外,如果你想进一步实现右键拖拽,这才涉及到事件处理。在MFC中,你会自然而然想到用OnRButtonDown和OnRButtonUp实现,但是那不是Windows窗体(Forms)的工作方式。虽然许多窗口类确实提供了可以改写的虚拟函数来处理常用消息(如:Form.OnActivated和Form.OnClosed),但是在.NET框架中编程,你必须要学会用事件来思考,而且要了解一个类提供了哪些事件。下面这个表列出了被Control类提供的比较常用的事件:

(表一)

Click HelpRequested MouseLeave
ContextMenuChanged Invalidated MouseMove
DoubleClick KeyDown MouseUp
DragDrop KeyPress MouseWheel
DragEnter KeyUp Move
DragLeave Layout Paint
DragOver Leave ParentChanged
EnabledChanged LostFocus Resize
Enter MouseDown SizeChanged
FontChanged MouseEnter StyleChanged
GotFocus MouseHover TextChanged

注意表中用黑体标出的事件,这些事件顾名便可思意:MouseDown、 MouseEnter、 MouseHover、 MouseLeave、 MouseMove  和 MouseUp,如果你想要处理右键按下事件,可以安装MouseDown 事件处理例程,用MouseEventArgs.Button == MouseButtons.Right 检查 MouseEventArgs,下面的代码段示范了如何来做:

  1. public class MyControl : Control  
  2. {  
  3.    // 构造函数  
  4.    public MyControl() {  
  5.       // 安装右键按下事件处理器   
  6.       this.myctl1.MouseDown +=   
  7.          new MouseEventHandler(this.OnMouseDown);  
  8.    }  
  9.  
  10.    // 处理例程  
  11.    private void OnMouseDown(object sender, MouseEventArgs e) {  
  12.       if (e==MouseButtons.Right)  
  13.          // do something  
  14.    }  
  15. }  

表一里有三个有用的鼠标事件是在MFC中不能直接处理的:MouseEnter、 MouseHover 和MouseLeave。在Win32 里,要处理这些事件必须通过专门的TrackMouseEvent 函数。.NET框架中,每当鼠标进入或离开特定控制时便会触发MouseEnter 和MouseLeave,当你想在鼠标移动到控制上时使控制呈高亮状态,这些事件相当有用,例如在浏览器中高亮显示链接。当鼠标移动到控制上后,在预先确定好的时间里(这个时间由 SystemParametersInfo(SPI_GETMOUSEHOVERTIME)) 指定),.NET 框架会激活 MouseHover。它在 Tooltips 和其它类似的定时弹出式功能应用中广泛使用。

这些鼠标事件和大家所熟悉的Click 事件有何关系呢?我想可以这么认为,Click属于层次较高的逻辑事件,而鼠标事件的级别相对较低,例如,不管用户按下的是左键还是右键,Forms都触发Click 事件,而文本框只能触发左键的Click事件。表二中列出了不同种类的控制其Click事件的含意。

(表二)由 Click 激发的事件

控制或控件 鼠标左键单击 鼠标左键双击 鼠标右键单击 鼠标右键双击 鼠标中键单击 鼠标中键双击
MonthCalendar, DateTimePicker, RichTextBox, HScrollBar, VScrollBar None None None None None None
Button, CheckBox, RadioButton Click Click, Click None None None None
ListBox, CheckedListBox, ComboBox Click Click, DoubleClick None None None None
TextBox, DomainUpDown, NumericUpDown Click Click, DoubleClick None None None None
*TreeView, *ListView Click Click, DoubleClick Click Click, DoubleClick None None
ProgressBar TrackBar Click Click, Click Click Click, Click Click Click, Click
Form, DataGrid, Label, LinkLabel, Panel,GroupBox, PictureBox, Splitter, DoubleClick, StatusBar,ToolBar, TabPage, **TabControl Click Click, DoubleClick Click Click, DoubleClick Click Click, DoubleClick
* 鼠标指针必须在子对象上方 (TreeNode 或 ListViewItem)
**  TabControl 必须在其 TabPages  页集合中至少有一个 TabPage。


***,不管怎样,只要你愿意,总是可以改写Control.WndProc 来处理任何WM_XXX 消息,比如:你可以定制WM_NCLBUTTONDOWN 消息处理代码:

  1. protected override void WndProc(ref Message m)  
  2. {  
  3.    // 值来自 winuser.h  
  4.    const int WM_NCLBUTTONDOWN = 0x00A1;  
  5.    if (m.Msg == WM_NCLBUTTONDOWN) {  
  6.       //do something  
  7.    }  
  8.    base.WndProc(ref m); // 这一步不能忘!  
  9. }  

我写了一个例子程序MouseTrap,如图一所示,

MouseEventTrap
图一 MouseEventTrap

该程序示范了如何进行鼠标事件的处理。如果你借WndProc处理消息,由于必须用IntPtrs获取消息参数,所以你或多或少要用C编程,但因为你已经谙熟C++,所以此时你不会感觉吃力,而是轻车熟路。

责任编辑:彭凡 来源: vckbase.com
相关推荐

2009-08-05 18:09:17

C#异常处理机制

2011-03-17 09:20:05

异常处理机制

2011-07-01 14:14:34

Qt 事件

2011-07-01 14:20:59

Qt 事件

2010-03-05 15:40:16

Python异常

2023-02-08 08:11:58

Spring容器核心事件

2009-08-12 15:20:21

C#事件处理

2021-03-02 09:12:25

Java异常机制

2023-06-15 14:09:00

解析器Servlet容器

2015-12-28 11:25:51

C++异常处理机制

2009-08-12 18:28:09

C#事件处理程序

2009-08-27 18:02:22

C#事件处理

2009-09-07 18:08:25

C#鼠标指针

2009-09-02 19:11:42

C#鼠标滚轮

2023-02-23 08:15:33

Spring异常处理机制

2021-03-25 07:44:39

C++异常处理开发技术

2009-08-04 09:56:46

C#事件处理自定义事件

2011-04-06 10:27:46

Java异常处理

2009-06-02 10:32:30

Oracle并发处理

2024-03-04 10:00:35

数据库处理机制
点赞
收藏

51CTO技术栈公众号