4

列表视图控件具有LVM_GETTOPINDEX允许获取最顶层可见项的索引的消息。

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

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

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

4

3 回答 3

2
  1. 使用LVM_GETITEMPOSITIONLVM_GETITEMRECT获取项目位置。
  2. 用于LVM_SCROLL滚动列表,使您的项目成为顶部项目。
于 2016-02-04T14:32:35.023 回答
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);
}
于 2016-02-04T14:32:44.477 回答
0

这个函数完成了这项工作:

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 给了我这个想法。

于 2016-02-08T19:10:51.840 回答