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

How to scroll a parent control with mouse wheel while child control has focus

By , 7 Jan 2011
Rate this:
Please Sign up or sign in to vote.
I have been working on a custom container control. I wanted the parent autoscroll inherited control to scroll with the mouse wheel, but when a contained control had focused, this wouldn't happen because the child control received the mouse events.
 
Many people use Windows APIs for this, to tell the window to scroll, but I found that tedious and the results weren't always preferable. After thinking about it, I realized that you could just call the container controls onMouseWheel base class method directly, and pass to it the mouse event args from the child control.
 
public void doMouseWheel(MouseEventArgs e)
{
    base.OnMouseWheel(e);
}
 

Simply creating a public method that handles calling the base class to our container control and for simplicity giving it an interface that shows it has this method:
 
public interface IMouseable
{
    void doMouseWheel(MouseEventArgs e);
}
 
Then in our child control, we just override its onMouseWheel event and call our parent IMouseable object's doMouseWheel method.
 
//capture mouse wheel events to ride them up to the host
protected override void OnMouseWheel(MouseEventArgs e)
{
    base.OnMouseWheel(e); //if you need local mouse wheel events
         
      //cast the parent to IMouseable and call its doMouseWheel mothod.
        ((IMouseable)(Parent)).doMouseWheel(e);
}
Yes, I do realize that is a messy cast, but this code is for educational purposes only.
 
And it's that simple, No API calls, no fancy event handling (although you could technically just subscribe to the child contols' onMouseWheel event and call the base class method that way, but this example doesn't show the reasons why it is simpler to use the interface. In my production code, there is actually a ladder of controls below the container control, and all of them could have focus and should taxi the scroll event upward to the parent.
 
It's not the only way, it might not be the best way, But I am very satisfied with the results of it so far.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Diamonddrake
Software Developer
United States United States
I am a part time programmer, The more I learn, the more I need to learn, the best of which I will share here on codeproject!
 
Visit my site and blog

Comments and Discussions

 
QuestionHow woud you do the opposite, ie. pass MouseWheel from parent to child control? Pinmembercp2k39-May-13 22:02 

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.140415.2 | Last Updated 7 Jan 2011
Article Copyright 2011 by Diamonddrake
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid