分类:
2008-10-13 16:38:07
C#中如何处理鼠标事件
编译/
过去用 C++/MFC 开发程序时,常常为用户提供鼠标的右键单击功能,如今在 .NET 框架中使用
C#,也想在程序中提供鼠标右键单击功能,比如,在文本框、窗格、标签以及主窗口背景上使用鼠标右键。毕竟 C# 不是 C++/MFC,那么如何用 C#
处理鼠标事件呢?本文下面将专门探讨这个问题。
在 .NET 框架下编程是非常容易的一件事情,有时候容易得连 C++ 程序员想都想不到。这主要是因为用 C++
编写代码常常需要“硬工夫”。所谓“硬工夫”,也就是很多细节都要自己考虑和处理。但使用 C#
则不然。如果你想显示上下文菜单,完全没有必要去和事件参合。只要设置控制的 ContextMenu 属性即可,就象下面这样:
ContextMenu myContextMenu = ... 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 |
public class MyControl : Control { // 构造函数 public MyControl() { // 安装右键按下事件处理器 this.myctl1.MouseDown += new MouseEventHandler(this.OnMouseDown); } // 处理例程 private void OnMouseDown(object sender, MouseEventArgs e) { if (e==MouseButtons.Right) // do something } }表一里有三个有用的鼠标事件是在 MFC 中不能直接处理的:MouseEnter、 MouseHover 和 MouseLeave。在 Win32 里,要处理这些事件必须通过专门的 TrackMouseEvent 函数。.NET 框架
控制或控件 | 鼠标左键单击 | 鼠标左键双击 | 鼠标右键单击 | 鼠标右键双击 | 鼠标中键单击 | 鼠标中键双击 |
---|---|---|---|---|---|---|
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。 |
protected override void WndProc(ref Message m) { // 值来自 winuser.h const int WM_NCLBUTTONDOWN = 0x00A1; if (m.Msg == WM_NCLBUTTONDOWN) { //do something } base.WndProc(ref m); // 这一步不能忘! }我写了一个例子程序 MouseTrap,如图一所示,