繁体   English   中英

列表控件需要LVM_SETTOPINDEX

[英]List control LVM_SETTOPINDEX needed

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

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

是否有一种简单的方法来设置最顶级的项目?

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

  1. 使用LVM_GETITEMPOSITIONLVM_GETITEMRECT获取项目位置。
  2. 使用LVM_SCROLL滚动列表,以便您的项目是顶部项目。

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

由于没有直接的方法,您可以计算页面上的项目数,将该计数添加到索引并调用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);
}

这个功能完成了这项工作:

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给我的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM