65.9K
CodeProject 正在变化。 阅读更多。
Home

具有滚动事件的 ScrollableControl

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.22/5 (21投票s)

2004 年 6 月 18 日

2分钟阅读

viewsIcon

90178

downloadIcon

1837

一个 ScrollableControl 扩展,用于生成水平和垂直滚动事件。

引言

如果你正在编写自己的控件,很有可能你将使用 .NET 框架类 Control 作为基类。 如果你想要编写一个控件,该控件充当更大虚拟区域的窗口(例如数据网格或绘图控件),那么 ScrollableControl 很好地封装了滚动条的处理。 到目前为止一切都很好 - 除了 ScrollableControl 有一个明显的遗漏。 如果我想跟踪我的控件何时被滚动怎么办?

我在编写自己的数据网格控件时遇到了这个问题。 我实际的网格在 ScrollableControl 派生类中运行良好,我想在一个单独的控件中实现一个列标题,并将它们组合到一个 Panel 控件对象中。 我希望我的列标题控件在我的数据网格控件水平滚动时水平滚动。 问题是,您可以判断 ScrollableControl 派生控件是否已被滚动的唯一方法是轮询其 AutoScrollPosition 值。 不理想! 我需要的是一个 ScrollableControl,它会发出封装 WM_HSCROLLWM_VSCROLL Windows 消息的滚动事件。

解决方案 - 一个扩展类

以真正的面向对象的方式,我从 ScrollableControl 类派生了一个新类,该类将生成额外的事件。 该类包含两个新滚动事件的事件存根,并覆盖了 WndProc 方法来拦截发送到控件的 Windows 消息。 我们让基类首先处理消息,以便它在触发事件之前更新控件的滚动位置。 最后,我们将事件转换为 ScrollHandlerEvent 通知,因为 .NET 框架中已经提供了此通知。

注释

ScrollableControlWithScrollEvents 类可以用于任何您使用过 ScrollableControl 类的地方。 如果您希望捕获来自 Panel 的滚动事件,也可以对 Panel 类进行类似的扩展。

玩得开心!

© . All rights reserved.