查看源代码 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/3wxWindow: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().

函数

链接到此函数

calcScrolledPosition(This, Pt)

查看源代码
-spec calcScrolledPosition(This, Pt) -> {X :: integer(), Y :: integer()}
                              when This :: wxScrolledWindow(), Pt :: {X :: integer(), Y :: integer()}.
链接到此函数

calcScrolledPosition(This, X, Y)

查看源代码
-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。

请参阅:calcUnscrolledPosition/3

链接到此函数

calcUnscrolledPosition(This, Pt)

查看源代码
-spec calcUnscrolledPosition(This, Pt) -> {X :: integer(), Y :: integer()}
                                when This :: wxScrolledWindow(), Pt :: {X :: integer(), Y :: integer()}.
链接到此函数

calcUnscrolledPosition(This, X, Y)

查看源代码
-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。

请参阅:calcScrolledPosition/3

-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,如上面的示例所示,当然不会出现此问题,因此通常这样做。

链接到此函数

enableScrolling(This, XScrolling, YScrolling)

查看源代码
-spec enableScrolling(This, XScrolling, YScrolling) -> ok
                         when
                             This :: wxScrolledWindow(),
                             XScrolling :: boolean(),
                             YScrolling :: boolean().

启用或禁用使用 wxWindow:scrollWindow/4 进行滚动。

默认情况下,当逻辑滚动滚动窗口时,会在底层窗口上调用 wxWindow:scrollWindow/4,它会滚动窗口内容,并且仅使新进入视图的窗口部分失效。如果将 false 作为参数传递,则禁用此“物理滚动”,并且只要通过调用 wxWindow:refresh/2 滚动窗口,该窗口就会完全失效。

应该很少需要禁用物理滚动,因此在正常情况下不应调用此方法。

链接到此函数

getScrollPixelsPerUnit(This)

查看源代码
-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),则会忽略该位置(该方向上没有变化)。

请参阅

链接到此函数

setScrollbars(This, PixelsPerUnitX, PixelsPerUnitY, NoUnitsX, NoUnitsY)

查看源代码
-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()}.

设置垂直和/或水平滚动条。

第一对参数指定每次“滚动步长”的像素数,即当按下向上或向下滚动箭头时移动的距离。第二对参数指定滚动条的滚动步长长度,这会设置虚拟窗口的大小。

xPosyPos 可选地指定要立即滚动到的位置。

例如,以下代码给出了一个具有水平和垂直滚动条的窗口,每次滚动步长为 20 像素,每个方向的大小为 50 步(1000 像素)。

wxScrolled (在 wx 中未实现) 使用当前客户端窗口大小作为页面大小来管理页面大小本身。

请注意,对于更复杂的滚动应用程序,例如,根据文档中的位置滚动步长可能不同,则需要从 wxWindow 派生一个新类,覆盖 OnSize() 并适当地调整滚动条。

请参阅:wxWindow:setVirtualSize/3

链接到此函数

setScrollRate(This, Xstep, Ystep)

查看源代码
-spec setScrollRate(This, Xstep, Ystep) -> ok
                       when This :: wxScrolledWindow(), Xstep :: integer(), Ystep :: integer().

仅设置水平和垂直滚动增量。

请参阅 setScrollbars/6 中的 pixelsPerUnit 参数。

链接到此函数

setTargetWindow(This, Window)

查看源代码
-spec setTargetWindow(This, Window) -> ok when This :: wxScrolledWindow(), Window :: wxWindow:wxWindow().

调用此函数告诉 wxScrolled(在 wx 中未实现)在不同的窗口(而不是自身)上执行实际滚动。

当只有窗口的一部分需要滚动时,此方法非常有用。一个典型的例子是包含固定标题和可滚动内容窗口的控件:滚动条附加到主窗口本身,因此,必须从 wxScrolled(在 wx 中未实现)派生主窗口,而不是内容窗口,但是当使用滚动条时,只有内容窗口滚动。要实现这样的设置,您需要使用内容窗口作为参数调用此方法。

请注意,如果使用此方法,则必须覆盖 GetSizeAvailableForScrollTarget() (在 wx 中未实现)方法。