这里将详细介绍C#鼠标事件的处理机制,毕竟C#不是C++/MFC,那么如何用C#处理鼠标事件呢?本文希望能对大家有所帮助。
曩昔用C++/MFC开发程序时,常常为用户供给鼠标的右键单击功用,现在在.NET结构中运用C#,也想在程序中供给鼠标右键单击功用,比方,在文本框、窗格、标签以及主窗口布景上运用鼠标右键。究竟C#不是C++/MFC,那么怎么处理C#鼠标工作呢?本文下面将专门讨论这个问题。
在.NET结构下编程是十分简略的一件工作,有时候简略得连C++程序员想都想不到。这首要是由于用C++编写代码常常需求“硬时刻”。所谓“硬时刻”,也便是许多细节都要自己考虑和处理。但运用C#则否则。假如你想显现上下文菜单,彻底没有必要去和工作参合。只需设置操控的ContextMenu特点即可,就象下面这样:
- ContextMenumyContextMenu=...
- 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,下面的代码段演示了怎么来做:
- publicclassMyControl:Control
- {
- //结构函数
- publicMyControl(){
- //装置右键按下工作处理器
- this.myctl1.MouseDown+=
- newMouseEventHandler(this.OnMouseDown);
- }
- //处理例程
- privatevoidOnMouseDown(objectsender,MouseEventArgse){
- if(e==MouseButtons.Right)
- //dosomething
- }
- }
表一里有三个有用的鼠标工作是在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 音讯处理代码:
- protectedoverridevoidWndProc(refMessagem)
- {
- //值来自winuser.h
- constintWM_NCLBUTTONDOWN=0x00A1;
- if(m.Msg==WM_NCLBUTTONDOWN){
- //dosomething
- }
- base.WndProc(refm);//这一步不能忘!
- }
我写了一个比如程序MouseTrap,如图一所示,
图一 MouseEventTrap
该程序演示了怎么进行鼠标工作的处理。假如你借WndProc处理音讯,由于有必要用IntPtrs获取音讯参数,所以你或多或少要用C编程,但由于你现已谙熟C++,所以此刻你不会感觉费劲,而是驾轻就熟。
知优网 » 详解C#鼠标事情的处理机制(C#鼠标事件)