这里将详细介绍C#鼠标事件的处理机制,毕竟C#不是C++/MFC,那么如何用C#处理鼠标事件呢?本文希望能对大家有所帮助。

C#鼠标工作包含鼠标的许多操作,比方为用户供给鼠标的右键单击功用、右键拖拽等等。处理C#鼠标工作比较简略,只需设置好特点,点击右键就会呈现菜单,进一步右键拖拽就涉及到时刻处理。

曩昔用C++/MFC开发程序时,常常为用户供给鼠标的右键单击功用,现在在.NET结构中运用C#,也想在程序中供给鼠标右键单击功用,比方,在文本框、窗格、标签以及主窗口布景上运用鼠标右键。究竟C#不是C++/MFC,那么怎么处理C#鼠标工作呢?本文下面将专门讨论这个问题。

在.NET结构下编程是十分简略的一件工作,有时候简略得连C++程序员想都想不到。这首要是由于用C++编写代码常常需求“硬时刻”。所谓“硬时刻”,也便是许多细节都要自己考虑和处理。但运用C#则否则。假如你想显现上下文菜单,彻底没有必要去和工作参合。只需设置操控的ContextMenu特点即可,就象下面这样:

  1. ContextMenumyContextMenu=...
  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. publicclassMyControl:Control
  2. {
  3. //结构函数
  4. publicMyControl(){
  5. //装置右键按下工作处理器
  6. this.myctl1.MouseDown+=
  7. newMouseEventHandler(this.OnMouseDown);
  8. }
  9. //处理例程
  10. privatevoidOnMouseDown(objectsender,MouseEventArgse){
  11. if(e==MouseButtons.Right)
  12. //dosomething
  13. }
  14. }

表一里有三个有用的鼠标工作是在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. protectedoverridevoidWndProc(refMessagem)
  2. {
  3. //值来自winuser.h
  4. constintWM_NCLBUTTONDOWN=0x00A1;
  5. if(m.Msg==WM_NCLBUTTONDOWN){
  6. //dosomething
  7. }
  8. base.WndProc(refm);//这一步不能忘!
  9. }

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

详解C#鼠标事情的处理机制(C#鼠标事件)  C#鼠标事件 第1张
图一 MouseEventTrap

该程序演示了怎么进行鼠标工作的处理。假如你借WndProc处理音讯,由于有必要用IntPtrs获取音讯参数,所以你或多或少要用C编程,但由于你现已谙熟C++,所以此刻你不会感觉费劲,而是驾轻就熟。

转载请说明出处
知优网 » 详解C#鼠标事情的处理机制(C#鼠标事件)

发表评论

您需要后才能发表评论