Click here to Skip to main content
Click here to Skip to main content

Mouse Events

, 2 Jun 2005
Rate this:
Please Sign up or sign in to vote.
A helper class to expand on the mouse events provided by the Control class.

Sample Image - mouseEventDemo.png

Introduction

I was recently implementing some right-click functionality for a TreeView, and I got to thinking, how many times have I handled the MouseUp event and tested for Buttons.Right because there isn't a RightClick event in the Control class? So I've written a mouse event helper class that lets you connect directly to these specific events:

public event EventHandler LeftClick;
public event EventHandler LeftDoubleClick;
public event EventHandler MiddleDoubleClick;
public event EventHandler RightDoubleClick;
public event EventHandler MiddleClick;
public event EventHandler RightClick;
public event MouseEventHandler LeftMouseDown;
public event MouseEventHandler LeftMouseUp;
public event MouseEventHandler MiddleMouseDown;
public event MouseEventHandler MiddleMouseUp;
public event MouseEventHandler RightMouseDown;
public event MouseEventHandler RightMouseUp;
public event MouseEventHandler WheelForward;
public event MouseEventHandler WheelBackward;

Implementation

The implementation is trivial. The MouseHelper class hooks the following control events:

protected virtual void Initialize()
{
  control.Click+=new EventHandler(OnClick);
  control.DoubleClick+=new EventHandler(OnDoubleClick);
  control.MouseDown+=new MouseEventHandler(OnMouseDown);
  control.MouseUp+=new MouseEventHandler(OnMouseUp);
  control.MouseWheel+=new MouseEventHandler(OnMouseWheel);
}

A typical handler looks like this:

private void OnClick(object sender, EventArgs e)
{
  switch(lastButton)
  {
    case MouseButtons.Left:
      if (LeftClick != null)
      {
        LeftClick(sender, e);
      }
      break;

    case MouseButtons.Middle:
      if (MiddleClick != null)
      {
        MiddleClick(sender, e);
      }
      break;

    case MouseButtons.Right:
      if (RightClick != null)
      {
        RightClick(sender, e);
      }
      break;
  }
}

You will note that this isn't intended to handle situations where more than one mouse button is being held down at a time.

Wheel Movement

One thing that's odd is that, for wheel movement, the documentation says that:

A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, towards the user.

However, if I push the wheel away from me, what I think would mean forward, the program actually says I'm moving the wheel backwards.

Usage

To use the MouseHelper class:

  • Instantiate the class and pass into the constructor the control for which you wish to trap mouse events.
  • Assign the control to the MouseHelper's Control property.
  • Use the MouseHelper's AddControl method.

You can add more than one control to the same mouse helper, which lets you combine mouse events from different controls into a single handler.

You should note that in the typical usage, you would use a unique MouseHelper instance for every Control class that you need to capture mouse events for. This is a drawback, but I wanted to keep the class simple. An alternative would be to have a static factory method that returns a MouseHandler instance for the specific control you want to extend. And possibly, an even more interesting implementation would be to have MouseHandler implement IExtenderProvider. Those may be future additions.

Conclusion

That's it! It's really simple, and now I have a helper class that takes care of the drudgery of writing over and over again the same "is the right button clicked" code. And my other motivation for writing this is because there was no way to handle right clicks declaratively. For example, I'd like to do something like this:

<TreeView RightClick="PopupMenu"/>

without writing a custom handler. Now I can!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Marc Clifton

United States United States
Marc is the creator of two open source projets, MyXaml, a declarative (XML) instantiation engine and the Advanced Unit Testing framework, and Interacx, a commercial n-tier RAD application suite.  Visit his website, www.marcclifton.com, where you will find many of his articles and his blog.
 
Marc lives in Philmont, NY.

Comments and Discussions

 
Generalutility to record mouse actions and keyboard PinmemberMember 1096506122-Jul-14 20:54 
GeneralMy vote of 4 PinmemberArash3agel24-Sep-11 21:19 
GeneralMy vote of 5 PinmemberJust_Michel27-Mar-11 20:41 
GeneralVery nice... and brief usage note. Pinmemberdsuilmann6-Oct-09 8:37 
GeneralGreat article! I am going to bookmark it. PinmemberDrABELL16-Sep-09 15:39 
QuestionMouseHelper for Web.UI.Forms Pinmemberalvarog0123-Feb-09 21:17 
GeneralMe too! PinmemberPIEBALDconsult13-Jun-08 15:24 
I wrote something like that a while back. I think it was also because I needed a TreeView to respond to the right click.
Every time I see the class I think I should write an article.
QuestionIs there has MouseMoveStop? PinmemberAndyLang12-Jul-07 4:26 
QuestionWheel click ? PinstaffChristian Graus27-Sep-06 23:21 
AnswerRe: Wheel click ? PinprotectorMarc Clifton28-Sep-06 1:00 
GeneralRe: Wheel click ? PinstaffChristian Graus28-Sep-06 1:10 
Questionproblem with listview columnheader Pinmemberrm_pkt17-Jan-06 19:19 
QuestionMultiple Controls to same MouseHelper? PinmemberDoncp8-Dec-05 10:27 
AnswerRe: Multiple Controls to same MouseHelper? PinprotectorMarc Clifton8-Dec-05 11:14 
QuestionListBox not supported? PinmemberDoncp7-Dec-05 10:38 
AnswerRe: ListBox not supported? PinprotectorMarc Clifton7-Dec-05 11:49 
GeneralRe: ListBox not supported? PinmemberDoncp8-Dec-05 4:48 
GeneralRe: ListBox not supported? PinprotectorMarc Clifton8-Dec-05 4:56 
Generalpersonally... Pinmember
MadHatter ¢
21-Jun-05 4:24 
GeneralSuggestion PinmemberMaximilian Hänel6-Jun-05 22:59 
GeneralAnother Great Article PinmemberSHaroz3-Jun-05 17:41 
GeneralGreat idea! PinmemberRobert Rohde2-Jun-05 11:52 
GeneralRe: Great idea! PinprotectorMarc Clifton2-Jun-05 12:08 
GeneralThe file is missing. Pinmemberyuren19782-Jun-05 9:49 
GeneralRe: The file is missing. PinprotectorMarc Clifton2-Jun-05 10:29 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140721.1 | Last Updated 2 Jun 2005
Article Copyright 2005 by Marc Clifton
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid