【问题标题】:Calculate scrollbar height in grid with varied row height计算具有不同行高的网格中的滚动条高度
【发布时间】:2011-10-30 16:05:39
【问题描述】:

我的网格有很多行(例如 1 000 000)。每行的高度可能是唯一的。但大多数行具有相同的高度。所以不可能确定每行的高度并获得总网格高度。

我需要在这个网格上实现平滑的垂直滚动,不仅仅是跳过行,因为行可以高于可见区域。

我的解决办法是:

  1. 获取行数
  2. 每行分为 10 个部分
  3. => 滚动条最大值为(行数)*10
  4. 从滚动位置我得到:
    • 第一个可见行 =(滚动位置)/10
    • 第一个可见行移位 =(滚动位置)% 10

如果所有行都具有 +- 相同的高度,则此工作正常。如果有一行的高度为 500 像素,而另一行的高度为 25 像素,则滚动看起来很糟糕。

有没有人建议如何更好地解决这个问题?

网格在这里: http://img560.imageshack.us/img560/7775/scroll.png

【问题讨论】:

    标签: c++ user-interface scroll grid scrollbar


    【解决方案1】:

    让滚动以像素为单位:

    • 对所有行的总高度求和,并将滚动条最大值设置为该值。
    • 在变量中缓存第一个可见行索引。
    • 当用户向上或向下滚动时,您可以从当前第一个可见行开始按顺序扫描以查找新行。这为顺序读取提供了每次更新的摊销恒定时间工作。
    • 您不会经常进行随机访问(例如滚动到第 N 行),因此在您这样做时进行线性搜索就可以了。如果您需要更快的东西(我对此表示怀疑),那么您可以预先计算行高的部分总和并进行二分搜索。

    【讨论】:

    • 从数据库中加载1 000 000行仅用于总高度的总和是无效的。
    • @weny:如果数据库不经常更新并且总是以相同的顺序显示,您可以将部分和存储在数据库中。抱歉,没有其他方法可以(正确)执行此操作。
    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2014-03-27
    • 2013-09-20
    相关资源
    最近更新 更多