需要列表控件 LVM_SETTOPINDEX
List control LVM_SETTOPINDEX needed
list-view control has the LVM_GETTOPINDEX
消息允许获取最顶部可见项的索引。
现在我需要设置 最上面的可见项,但令人惊讶的是没有 LVM_SETTOPINDEX
自然的消息。
有没有简单明了的方法来设置最上面的项目?
我的列表控件总是处于报告模式。
- 使用
LVM_GETITEMPOSITION
或LVM_GETITEMRECT
获取项目位置。
- 使用
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 给我的想法。
list-view control has the LVM_GETTOPINDEX
消息允许获取最顶部可见项的索引。
现在我需要设置 最上面的可见项,但令人惊讶的是没有 LVM_SETTOPINDEX
自然的消息。
有没有简单明了的方法来设置最上面的项目?
我的列表控件总是处于报告模式。
- 使用
LVM_GETITEMPOSITION
或LVM_GETITEMRECT
获取项目位置。 - 使用
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 给我的想法。