If you are writing your own control, the chances are that you are going to be using the .NET framework class
Control as a base class. If you are wanting to write a control that acts as a window onto a larger virtual area (such as a data grid or a drawing control), then
ScrollableControl nicely encapsulates the handling of the scrollbars. So far so good - except
ScrollableControl has one glaring omission. What if I want to track when my control has been scrolled?
I came across this problem when I was writing my own data grid control. My actual grid worked nicely in a
ScrollableControl derived class, and I wanted to implement a column header in a separate control and combine them both into a
Panel control object. I wanted my column header control to scroll horizontally when my data grid control scrolled horizontally. The problem was that the only way you can tell if the
ScrollableControl derived control had been scrolled was to poll its
AutoScrollPosition value. Not ideal! What I needed was a
ScrollableControl that would send out scroll events encapsulating the
WM_VSCROLL Windows messages.
The Solution - An Extended Class
In true object-orientated fashion, I derived a new class from the
ScrollableControl class that would generate the extra events. The class contains event stubs for the two new scroll events, and overrides the
WndProc method to intercept Windows messages sent to the control. We let the base class handle the message first so that it updates the scroll position of the the control before firing the event. Finally, we translate the event into a
ScrollHandlerEvent notification as this is already provided in the .NET framework.
ScrollableControlWithScrollEvents class can be used anywhere you have used the
ScrollableControl class. A similar extension could be made to the
Panel class if you wish to trap scroll events from that.