LibreOffice 对话框中的滚动条
Scroll bar in LibreOffice dialog
我正在尝试在 LibreOffice 中制作图像选择器组件。
我有一个动态填充图像的对话框。当用户点击一张图片时,应该选择它并关闭对话框。
问题是图像的数量是可变的。所以我需要在对话框中启用滚动(以便用户可以浏览所有图像)。
对话框对象上似乎有一些属性(滚动条、滚动宽度、滚动高度等)
但是,我找不到在任何地方使用它们的方法。
有什么想法吗?
滚动条是对话框编辑器提供的 Controls
之一。这是在对话框上放置 ScrollBar
的更简单方法。就像任何其他控件一样插入它。通过 DialogModel.addControl
有一个更难的方法,但这对于回答这个问题似乎不是必需的。
如果在对话框中添加滚动条并运行对话框,您会发现默认情况下它什么都不做。功能(显然)必须写入宏。适当的触发事件是 ScrollBar
对象上的 While Adjusting
事件,尽管它不会仅通过对话框编辑器中的 "Test Mode" 函数触发宏。 运行 通过宏的对话框在触发滚动箭头、单击滑块区域移动滑块以及拖动滑块本身时触发 While Adjusting
事件。滚动条事件返回的Object
变量包含一个属性.Value
,是一个介于0和EventObject.Model.ScrollValueMax
之间的绝对值,可以让你操作页面上的其他对象手动根据滑块的位置。
是的,没错,手动操作对象。我从 LibreOffice 4.5 SDK 中找到的唯一示例正是这样做的。当然,它并不像听起来那么糟糕,因为可以通过读取数组 Dialog.getControls()
来遍历页面上的所有对象。无论如何,SDK 中提供的示例的秘诀是定义 Static
变量来保存您使用滚动条操作的所有对象的初始位置,然后根据导出的比率简单地索引这些初始位置从滚动条 Value
除以 ScrollValueMax
.
这是一个关于如何滚动的非常简单的工作示例。这需要在文档的 Standard
库中保存 Dialog1
,其中包含对象 ScrollBar1
(垂直滚动条)和对话框中任意位置的 Label1
。 ScrollBar1
必须配置为在 While Adjusting
事件上执行宏 ScrBar
子例程(如下)。通过执行 OpenDialog
宏打开对话框,滚动条将根据页面比例上下移动 Label1
控件。
Sub OpenDialog
DialogLibraries.LoadLibrary("Standard")
oVariable = DialogLibraries.Standard.Dialog1
oDialog1 = CreateUnoDialog( oVariable )
oDialog1.Execute()
End Sub
Sub ScrBar (oEventObj As Object)
Static bInit As Boolean
Static PositionLbl1Y0 As Long
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
oContx = oSrc.Context
oContxModl = oContx.Model
oLbl1 = oContx.getControl("Label1")
oLbl1Model = oLbl1.Model
REM on initialization remember the position of the label
If bInit = False Then
bInit = True
PositionLbl1Y0 = oLbl1Model.PositionY
End If
oLbl1Model.PositionY = PositionLbl1Y0 - (scrollRatio * oContx.Size.Height)
End Sub
SDK 提供的示例在我的设置中没有运行,但原理是正确的。
似乎还有第二种临时方法更接近人们可能期望的功能。这个方法使用了DialogModel.scrollTop
属性。 属性 似乎根据用户输入将整个框向上或向下迭代为滚动。然而,使用这种方法有两个问题。首先,除非您将滚动条放在其他地方,否则滚动条将与页面的其余部分一起滚动。您需要精确调整滚动条的位置以补偿for/negate 整个页面的滚动。在下面的示例中,我尝试了但没有完善它。其次,属性 似乎错过了频率输入,很容易失去对齐/进入失调状态。也许您可以克服这些限制。这是示例,依赖于上述相同的设置。
Sub ScrBar (oEventObj As Object)
Static scrollPos
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
If IsEmpty(scrollPos) = False Then
scrollDiff = oEventObj.Value - scrollPos
Else
scrollDiff = oEventObj.Value
End If
scrollPos = oEventObj.Value
oContx = oSrc.Context
oContxModl = oContx.Model
oContxModl.scrollTop = scrollDiff * -1
oSrcModel.PositionY=(scrollRatio * oContx.Size.Height/5) * -1
End Sub
这(某种程度上)将滚动整个对话框的内容,在限制范围内并带有上述注意事项。
我正在尝试在 LibreOffice 中制作图像选择器组件。 我有一个动态填充图像的对话框。当用户点击一张图片时,应该选择它并关闭对话框。 问题是图像的数量是可变的。所以我需要在对话框中启用滚动(以便用户可以浏览所有图像)。
对话框对象上似乎有一些属性(滚动条、滚动宽度、滚动高度等) 但是,我找不到在任何地方使用它们的方法。
有什么想法吗?
滚动条是对话框编辑器提供的 Controls
之一。这是在对话框上放置 ScrollBar
的更简单方法。就像任何其他控件一样插入它。通过 DialogModel.addControl
有一个更难的方法,但这对于回答这个问题似乎不是必需的。
如果在对话框中添加滚动条并运行对话框,您会发现默认情况下它什么都不做。功能(显然)必须写入宏。适当的触发事件是 ScrollBar
对象上的 While Adjusting
事件,尽管它不会仅通过对话框编辑器中的 "Test Mode" 函数触发宏。 运行 通过宏的对话框在触发滚动箭头、单击滑块区域移动滑块以及拖动滑块本身时触发 While Adjusting
事件。滚动条事件返回的Object
变量包含一个属性.Value
,是一个介于0和EventObject.Model.ScrollValueMax
之间的绝对值,可以让你操作页面上的其他对象手动根据滑块的位置。
是的,没错,手动操作对象。我从 LibreOffice 4.5 SDK 中找到的唯一示例正是这样做的。当然,它并不像听起来那么糟糕,因为可以通过读取数组 Dialog.getControls()
来遍历页面上的所有对象。无论如何,SDK 中提供的示例的秘诀是定义 Static
变量来保存您使用滚动条操作的所有对象的初始位置,然后根据导出的比率简单地索引这些初始位置从滚动条 Value
除以 ScrollValueMax
.
这是一个关于如何滚动的非常简单的工作示例。这需要在文档的 Standard
库中保存 Dialog1
,其中包含对象 ScrollBar1
(垂直滚动条)和对话框中任意位置的 Label1
。 ScrollBar1
必须配置为在 While Adjusting
事件上执行宏 ScrBar
子例程(如下)。通过执行 OpenDialog
宏打开对话框,滚动条将根据页面比例上下移动 Label1
控件。
Sub OpenDialog
DialogLibraries.LoadLibrary("Standard")
oVariable = DialogLibraries.Standard.Dialog1
oDialog1 = CreateUnoDialog( oVariable )
oDialog1.Execute()
End Sub
Sub ScrBar (oEventObj As Object)
Static bInit As Boolean
Static PositionLbl1Y0 As Long
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
oContx = oSrc.Context
oContxModl = oContx.Model
oLbl1 = oContx.getControl("Label1")
oLbl1Model = oLbl1.Model
REM on initialization remember the position of the label
If bInit = False Then
bInit = True
PositionLbl1Y0 = oLbl1Model.PositionY
End If
oLbl1Model.PositionY = PositionLbl1Y0 - (scrollRatio * oContx.Size.Height)
End Sub
SDK 提供的示例在我的设置中没有运行,但原理是正确的。
似乎还有第二种临时方法更接近人们可能期望的功能。这个方法使用了DialogModel.scrollTop
属性。 属性 似乎根据用户输入将整个框向上或向下迭代为滚动。然而,使用这种方法有两个问题。首先,除非您将滚动条放在其他地方,否则滚动条将与页面的其余部分一起滚动。您需要精确调整滚动条的位置以补偿for/negate 整个页面的滚动。在下面的示例中,我尝试了但没有完善它。其次,属性 似乎错过了频率输入,很容易失去对齐/进入失调状态。也许您可以克服这些限制。这是示例,依赖于上述相同的设置。
Sub ScrBar (oEventObj As Object)
Static scrollPos
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value / oSrcModel.ScrollValueMax
If IsEmpty(scrollPos) = False Then
scrollDiff = oEventObj.Value - scrollPos
Else
scrollDiff = oEventObj.Value
End If
scrollPos = oEventObj.Value
oContx = oSrc.Context
oContxModl = oContx.Model
oContxModl.scrollTop = scrollDiff * -1
oSrcModel.PositionY=(scrollRatio * oContx.Size.Height/5) * -1
End Sub
这(某种程度上)将滚动整个对话框的内容,在限制范围内并带有上述注意事项。