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(垂直滚动条)和对话框中任意位置的 Label1ScrollBar1 必须配置为在 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

这(某种程度上)将滚动整个对话框的内容,在限制范围内并带有上述注意事项。