在wxWidgets中,滚动条有多种表现形式。所有窗口都有可能显示垂直滚动条和/或水平滚动条:这是窗口的一项基本功能。然而,在实际情况中,并非所有窗口都会用到滚动条,比如单行的wx.TextCtrl文本控件。
由于任何从wx.Window派生的类都可能带有滚动条,因此存在用于操作滚动条的函数以及用于拦截滚动事件的事件处理程序。但是,仅仅因为一个窗口生成了一个滚动事件,并不意味着该窗口一定会处理这个事件并实际滚动窗口。实际上,基类wx.Window没有任何处理滚动事件的默认功能。如果你创建了一个带有滚动条的wx.Window对象,然后点击这些滚动条,根本不会有任何反应。这是有意为之的,因为不同的窗口类对滚动事件的解释各不相同。
wx.ScrolledWindow是一个为使滚动功能真正生效而添加了相关功能的窗口示例。它假定滚动是以一致的单位进行的,而不是不同大小的跳跃式滚动,并且页面大小由窗口的可见部分来表示。它适合于绘图应用程序,但对于一个复杂的编辑器来说可能不太适用,因为在这种编辑器中,滚动的量可能会根据给定行上文本的大小而变化。对于这种情况,你需要从wx.Window派生并自行实现滚动功能。wx.grid.Grid是一个自行实现滚动功能的类的示例,这在很大程度上是因为其列和行的大小可能会有所不同。
滚动条模型
函数wx.Window.SetScrollbar为滚动条的建模方式提供了一些线索。这个函数接受以下参数:
| 方向 | 表示是哪一个滚动条: wx.VERTICAL或wx.HORIZONTAL。 |
|---|---|
| 位置 | 滚动条在滚动单位中的位置。 |
| 可见性 | 滚动条可见部分的大小,以滚动单位来衡量。 |
| 范围 | 滚动条的最大位置。 |
| 刷新 | 表示是否应该重绘该滚动条。 |
方向决定了我们所讨论的是内置的水平滚动条还是垂直滚动条。
位置指的仅仅是“滑块”(即你拖动来进行滚动操作的那一部分)的位置。它是以滚动单位来表示的,因此是相对于滚动条的总范围而言的。
可见性表示代表当前窗口可见部分的滚动单位数量。通常情况下,滚动条能够通过显示不同长度的滑块来直观地指示这一数值。
范围是滚动条的最大值,其中零是起始位置。你可以选择适合自己的单位,所以如果你想要显示有100行的文本,你可以将其设置为100。请注意,这并不一定与滚动的像素数量相对应——实际上如何显示窗口的内容由你自己决定。
刷新仅仅指示是否应该立即重绘该滚动条。
示例
假设你希望使用相同的字体显示50行文本。窗口的大小设定使得你一次只能看到16行。你可以这样使用:
SetScrollbar(wx.VERTICAL, 0, 16, 50)
注意: 请注意,对于这样大小的窗口,滑块的位置永远不会超过50减去16,也就是34。你可以通过将当前视图大小除以字符的像素高度来确定当前可见的行数。当定义你自己的滚动条行为时,每当窗口大小发生变化,你都需要重新计算滚动条的设置。因此,你可以将滚动条的计算以及对SetScrollbar函数的调用放在一个名为AdjustScrollbars的函数中,这个函数既可以在最初调用,也可以在你的wx.SizeEvent处理函数中调用。