【问题标题】:List control LVM_SETTOPINDEX needed需要列表控制 LVM_SETTOPINDEX
【发布时间】:2016-02-04 14:13:38
【问题描述】:

list-view controlLVM_GETTOPINDEX 消息,允许获取最顶部可见项的索引。

现在我需要设置最上面的可见项目,但令人惊讶的是没有自然的LVM_SETTOPINDEX消息。

有没有一种简单干净的方法来设置最上面的项目?

我的列表控件始终处于报告模式。

【问题讨论】:

  • LVM_ENSUREVISIBLE 消息是一个开始。将 lParam 设置为 FALSE 以确保项目完全可见。但这只是确保它是可见的,它不一定将它放大到列表的顶部。当然,这将是相当困难的,这取决于列表视图控件的大小和其中的项目数。
  • @CodyGray as you write LVM_ENSUREVISIBLE 是一个开始,但这只是确保执行最小滚动以使所选项目可见,它将位于最后一行的第一行或最后一行on 如果所选项目在视图上方或下方。 LVM_SETTOPINDEX 又是微软忘记的东西。
  • 考虑一下你是否有一个非常大的列表视图控件,并且只有几个项目。这些项目没有填满盒子,并且没有理由出现滚动条。现在,您将如何滚动它们以使项目#5 位于顶部?你不能。你不能以交互方式进行,也不能以编程方式进行。当然有时它会起作用,但有时它不会,所以你不能有一个通用的消息来做它。
  • 获取最上面的项目(LVM_GETTOPINDEX),如果想要的项目在上面你可以调用LVM_ENSUREVISIBLE,如果在下面,获取当前视口内的项目数(LVM_GETCOUNTPERPAGE ) 然后你可以计算你需要与LVM_ENSUREVISIBLE一起使用的项目的索引,以将所需的项目带到顶部(want_at_top_index + LVM_GETCOUNTPERPAGE) - 1
  • 我要做的是确保所需的项目首先可见,然后获取顶部索引,如果它们不是同一个项目,则计算它们之间的项目数并滚动 ListView 多个项目乘以当前项目高度。这也允许我在当前视图中的任何特定位置显示任何项目,而不仅仅是在顶部。例如,有时我希望一个项目出现在中心。

标签: winapi mfc comctl32


【解决方案1】:
  1. 使用LVM_GETITEMPOSITIONLVM_GETITEMRECT获取物品位置。
  2. 使用LVM_SCROLL 滚动列表,使您的项目成为顶部项目。

【讨论】:

  • 这就是我需要的,下面我自己的答案。
  • 我认为我的答案已经满足了所有需要,不是吗?这个概念肯定很重要。我不确定你对这个答案有什么看法。
  • 你的回答很好,我只是在自己的回答中提供了实现。
【解决方案2】:

首先,这可能是不可能的。例如,如果列表在顶部索引之后没有足够的项目来填充页面。

由于没有直接的方法,您可以计算页面上的项目数,将该计数添加到您的索引中并致电EnsureVisible()。这将确保您的顶部高于可见页面。您的项目的下一个EnsureVisible() 会将其带到页面顶部的视图中。当然,您需要阻止更新以避免屏幕抖动。

示例(由 Vlad 更新):

void CDlg::SetTopIndex(int top)
{
    int bottom = min(top + m_List.GetCountPerPage(), m_List.GetItemCount() - 1);
    m_List.SetRedraw(FALSE);
    m_List.EnsureVisible(bottom, TRUE);
    m_List.EnsureVisible(top, FALSE);
    m_List.SetRedraw(TRUE);
}

【讨论】:

  • 我不介意,但我刚刚更新了您的示例以反映我的建议。
【解决方案3】:

这个函数可以完成这项工作:

void SetTopIndex(CListCtrl & listctrl, int topindex)
{
  int actualtopindex = listctrl.GetTopIndex();
  int horspacing;
  int lineheight;
  listctrl.GetItemSpacing(TRUE, &horspacing, &lineheight);

  CSize scrollsize(0, (topindex - actualtopindex) * lineheight);
  listctrl.Scroll(scrollsize);
}

这里没有进行参数清理。

感谢 David Heffernan 和 Remy Lebeau 给我这个想法。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2016-04-28
    • 2013-02-26
    • 2014-01-08
    • 1970-01-01
    • 2015-07-01
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多