查看源代码 wxScrolledWindow (wx v2.4.3)
wxScrolled
类(在 wx 中未实现)管理其客户区的滚动,根据滚动条位置转换坐标,并根据视图中的区域设置滚动位置、拇指大小和范围。
这个类有两个常用的(但不是唯一可能的!)特化
?wxScrolledWindow,又名 wxScrolled<wxPanel>,等同于早期版本的 ?wxScrolledWindow。从
wxPanel
派生而来,它在 TAB 遍历和焦点处理方面与wxPanel
共享行为。如果滚动窗口将具有子控件,请使用此项。?wxScrolledCanvas,又名 wxScrolled<wxWindow>,从
wxWindow
派生而来,因此不专门处理子控件。这适用于实现可滚动控件,例如树或列表控件。
注意:如果您想将 wxScrolled
(在 wx 中未实现)与自定义类一起使用,请参阅 wxScrolled::Create()
(在 wx 中未实现)。
从 wxWidgets 的 2.4 版本开始,有几种使用 ?wxScrolledWindow(现在是 wxScrolled
(在 wx 中未实现))的方法。特别是,有三种方法可以设置滚动区域的大小
一种方法是使用对 setScrollbars/6
的调用直接设置滚动条。这是以前任何版本的 wxWidgets 中使用的方式,并且为了向后兼容性将保留它。
另一种手动控制方法,需要较少的您自己的计算,是通过调用 wxWindow:setVirtualSize/3
或 wxWindow:fitInside/1
来设置滚动区域的总大小,并通过调用 setScrollRate/3
为其设置滚动增量。通过为某个方向设置非零增量,可以启用该方向的滚动。
最自动和最新的方法是简单地让尺寸器确定滚动区域。现在,当您使用 wxWindow:setSizer/3
将内部尺寸器设置到 wxScrolled
(在 wx 中未实现)时,这是默认设置。滚动区域将设置为尺寸器请求的大小,并且将根据需要为每个方向分配滚动条,以及由 setScrollRate/3
设置的滚动增量。如上所述,仅在增量非零的方向上启用滚动。您可以通过调用 wxWindow::SetVirtualSizeHints() 来影响由尺寸器控制的滚动区域的最小大小。(调用 setScrollbars/6
在 wxWidgets 2.4 中具有类似的效果 - 在更高版本中,它可能不会继续覆盖尺寸器。)
请注意,如果 wxWindow::SetVirtualSizeHints() 仍然支持最大大小提示,请您自担风险使用它们。它们可能已从 2.4 中删除,也可能没有删除,但在这里设置最小大小提示才真正有意义。我们应该将 wxWindow::SetVirtualSizeHints() 替换为 wxWindow::SetMinVirtualSize() 或类似的东西,并在将来完全删除它。
与所有窗口一样,应用程序可以使用设备上下文在 wxScrolled
(在 wx 中未实现)上绘制。
您可以选择处理 OnPaint 处理程序或覆盖 wxScrolled::OnDraw()
(在 wx 中未实现)函数,该函数被传递一个预滚动的设备上下文(由 doPrepareDC/2
准备)。
如果您不希望计算自己的滚动,则在不是从 OnDraw()
(在 wx 中未实现)内部进行绘制时,必须调用 doPrepareDC/2
,以便根据当前的滚动位置为设备上下文设置设备原点。
wxScrolled
(在 wx 中未实现)通常会滚动自身以及它的子窗口。但是,可能希望滚动与自身不同的窗口:例如,在设计电子表格时,您通常只需要滚动(通常为白色)的单元格区域,而(通常为灰色)的标签区域的滚动方式则非常不同。对于此特殊目的,您可以调用 setTargetWindow/2
,这意味着按下滚动条将滚动不同的窗口。
请注意,底层系统对滚动坐标一无所知,因此所有系统函数(鼠标事件、公开事件、刷新调用等)以及子窗口的位置都是相对于滚动窗口的“物理”原点。如果用户在位置 (10,10) 插入一个子窗口,并将窗口向下滚动 100 像素(将子窗口移出可见区域),则子窗口将报告位置为 (10,-90)。
样式
此类支持以下样式
wxHSCROLL:如果指定此样式且未指定 ?wxVSCROLL,则窗口将仅在水平方向上可滚动(默认情况下,即如果未指定此样式或 ?wxVSCROLL,则它会在两个方向上滚动)。
wxVSCROLL:如果指定此样式且未指定 ?wxHSCROLL,则窗口将仅在垂直方向上可滚动(默认情况下,即如果未指定此样式或 ?wxHSCROLL,则它会在两个方向上滚动)。
wxALWAYS_SHOW_SB:自 wxWidgets 2.9.5 起,指定此样式会使窗口始终显示其滚动条,即使它们未使用。请参阅
ShowScrollbars()
(在 wx 中未实现)。wxRETAINED:使用后备像素图来加速刷新。仅限 Motif。
请参阅
此类派生自,并且可以使用来自以下的函数
wxWidgets 文档:wxScrolledWindow
事件
从此类发出的事件类型
摘要
函数
将逻辑坐标转换为设备坐标。
将设备坐标转换为逻辑坐标。
销毁对象
调用此函数以准备设备上下文以绘制滚动图像。
获取每个滚动单位(行)的像素数,如 setScrollbars/6
设置。
这是 GetViewStart(int,int) 的简单重载;有关更多信息,请参阅该函数。
默认构造函数。
构造函数。
此函数仅用于向后兼容性,现在仅调用 doPrepareDC/2
。
这是 scroll/3
的重载;有关更多信息,请参阅该函数。
滚动窗口,使视图起点位于给定点。
设置垂直和/或水平滚动条。
仅设置水平和垂直滚动增量。
调用此函数告诉 wxScrolled
(在 wx 中未实现)在不同的窗口(而不是自身)上执行实际滚动。
类型
-type wxScrolledWindow() :: wx:wx_object().
函数
-spec calcScrolledPosition(This, Pt) -> {X :: integer(), Y :: integer()} when This :: wxScrolledWindow(), Pt :: {X :: integer(), Y :: integer()}.
-spec calcScrolledPosition(This, X, Y) -> {Xx :: integer(), Yy :: integer()} when This :: wxScrolledWindow(), X :: integer(), Y :: integer().
将逻辑坐标转换为设备坐标。
例如,如果一个窗口向下滚动 10 个像素,则原点的设备坐标为 (0, 0)(始终如此),但逻辑坐标为 (0, 10),因此调用 CalcScrolledPosition(0, 10, xx, yy) 将在 yy 中返回 0。
-spec calcUnscrolledPosition(This, Pt) -> {X :: integer(), Y :: integer()} when This :: wxScrolledWindow(), Pt :: {X :: integer(), Y :: integer()}.
-spec calcUnscrolledPosition(This, X, Y) -> {Xx :: integer(), Yy :: integer()} when This :: wxScrolledWindow(), X :: integer(), Y :: integer().
将设备坐标转换为逻辑坐标。
例如,如果一个窗口向下滚动 10 个像素,则原点的设备坐标为 (0, 0)(始终如此),但逻辑坐标为 (0, 10),因此调用 CalcUnscrolledPosition(0, 0, xx, yy) 将在 yy 中返回 10。
-spec destroy(This :: wxScrolledWindow()) -> ok.
销毁对象
-spec doPrepareDC(This, Dc) -> ok when This :: wxScrolledWindow(), Dc :: wxDC:wxDC().
调用此函数以准备设备上下文以绘制滚动图像。
它根据当前滚动位置设置设备原点。doPrepareDC/2
在默认的 wxEVT_PAINT
事件处理程序中自动调用,因此您的 OnDraw()
(在 wx 中未实现)覆盖将被传递一个已经“预滚动”的设备上下文。但是,如果您希望从 OnDraw()
(在 wx 中未实现)之外进行绘制(例如,从您自己的 wxEVT_PAINT
处理程序),则必须自己调用此函数。
例如
请注意,该函数通过相对于当前原点位置移动原点来设置原点,因此您不应该在调用 doPrepareDC/2
之前更改原点,或者,如果您这样做,请稍后将其重置为 (0, 0)。如果您在创建设备上下文后立即调用 doPrepareDC/2
,如上面的示例所示,当然不会出现此问题,因此通常这样做。
-spec enableScrolling(This, XScrolling, YScrolling) -> ok when This :: wxScrolledWindow(), XScrolling :: boolean(), YScrolling :: boolean().
启用或禁用使用 wxWindow:scrollWindow/4
进行滚动。
默认情况下,当逻辑滚动滚动窗口时,会在底层窗口上调用 wxWindow:scrollWindow/4
,它会滚动窗口内容,并且仅使新进入视图的窗口部分失效。如果将 false 作为参数传递,则禁用此“物理滚动”,并且只要通过调用 wxWindow:refresh/2
滚动窗口,该窗口就会完全失效。
应该很少需要禁用物理滚动,因此在正常情况下不应调用此方法。
-spec getScrollPixelsPerUnit(This) -> {XUnit :: integer(), YUnit :: integer()} when This :: wxScrolledWindow().
获取每个滚动单位(行)的像素数,如 setScrollbars/6
设置。
零值表示在该方向上不滚动。
请参阅
-spec getViewStart(This) -> {X :: integer(), Y :: integer()} when This :: wxScrolledWindow().
这是 GetViewStart(int,int) 的简单重载;有关更多信息,请参阅该函数。
-spec new() -> wxScrolledWindow().
默认构造函数。
-spec new(Parent) -> wxScrolledWindow() when Parent :: wxWindow:wxWindow().
等效于 new(Parent, [])
。
-spec new(Parent, [Option]) -> wxScrolledWindow() when Parent :: wxWindow:wxWindow(), Option :: {winid, integer()} | {pos, {X :: integer(), Y :: integer()}} | {size, {W :: integer(), H :: integer()}} | {style, integer()}.
构造函数。
备注:窗口最初创建时没有可见的滚动条。调用 setScrollbars/6
以指定虚拟窗口的大小。
-spec prepareDC(This, Dc) -> ok when This :: wxScrolledWindow(), Dc :: wxDC:wxDC().
此函数仅用于向后兼容性,现在仅调用 doPrepareDC/2
。
请注意,默认的绘制事件处理程序不调用它(doPrepareDC/2
调用),因此在派生类中覆盖此方法是无用的。
-spec scroll(This, Pt) -> ok when This :: wxScrolledWindow(), Pt :: {X :: integer(), Y :: integer()}.
这是 scroll/3
的重载;有关更多信息,请参阅该函数。
-spec scroll(This, X, Y) -> ok when This :: wxScrolledWindow(), X :: integer(), Y :: integer().
滚动窗口,使视图起点位于给定点。
备注:位置以滚动单位而非像素为单位,因此要转换为像素,您必须乘以每个滚动增量的像素数。如果任一参数是 ?wxDefaultCoord (-1),则会忽略该位置(该方向上没有变化)。
请参阅
-spec setScrollbars(This, PixelsPerUnitX, PixelsPerUnitY, NoUnitsX, NoUnitsY) -> ok when This :: wxScrolledWindow(), PixelsPerUnitX :: integer(), PixelsPerUnitY :: integer(), NoUnitsX :: integer(), NoUnitsY :: integer().
等效于 setScrollbars(This, PixelsPerUnitX, PixelsPerUnitY, NoUnitsX, NoUnitsY, [])
。
-spec setScrollbars(This, PixelsPerUnitX, PixelsPerUnitY, NoUnitsX, NoUnitsY, [Option]) -> ok when This :: wxScrolledWindow(), PixelsPerUnitX :: integer(), PixelsPerUnitY :: integer(), NoUnitsX :: integer(), NoUnitsY :: integer(), Option :: {xPos, integer()} | {yPos, integer()} | {noRefresh, boolean()}.
设置垂直和/或水平滚动条。
第一对参数指定每次“滚动步长”的像素数,即当按下向上或向下滚动箭头时移动的距离。第二对参数指定滚动条的滚动步长长度,这会设置虚拟窗口的大小。
xPos
和 yPos
可选地指定要立即滚动到的位置。
例如,以下代码给出了一个具有水平和垂直滚动条的窗口,每次滚动步长为 20 像素,每个方向的大小为 50 步(1000 像素)。
wxScrolled
(在 wx 中未实现) 使用当前客户端窗口大小作为页面大小来管理页面大小本身。
请注意,对于更复杂的滚动应用程序,例如,根据文档中的位置滚动步长可能不同,则需要从 wxWindow
派生一个新类,覆盖 OnSize() 并适当地调整滚动条。
-spec setScrollRate(This, Xstep, Ystep) -> ok when This :: wxScrolledWindow(), Xstep :: integer(), Ystep :: integer().
仅设置水平和垂直滚动增量。
请参阅 setScrollbars/6
中的 pixelsPerUnit 参数。
-spec setTargetWindow(This, Window) -> ok when This :: wxScrolledWindow(), Window :: wxWindow:wxWindow().
调用此函数告诉 wxScrolled
(在 wx 中未实现)在不同的窗口(而不是自身)上执行实际滚动。
当只有窗口的一部分需要滚动时,此方法非常有用。一个典型的例子是包含固定标题和可滚动内容窗口的控件:滚动条附加到主窗口本身,因此,必须从 wxScrolled
(在 wx 中未实现)派生主窗口,而不是内容窗口,但是当使用滚动条时,只有内容窗口滚动。要实现这样的设置,您需要使用内容窗口作为参数调用此方法。
请注意,如果使用此方法,则必须覆盖 GetSizeAvailableForScrollTarget()
(在 wx 中未实现)方法。