gpt4 book ai didi

winapi - CListCtrl:如何保持水平滚动位置?

转载 作者:行者123 更新时间:2023-12-01 15:34:24 24 4
gpt4 key购买 nike

如何保持CListCtrl的水平滚动条位置?我会定期转储并重新填充列表控件的内容,因此无需显式记住旧位置并将其恢复,滚动只返回到左上角。

我早些时候问了一个相关的问题CListCtrl: How to maintain scroll position?,但是当时我只对垂直滚动位置感兴趣,提供的答案解决了这个问题。但是,现在我想记住并恢复水平滚动位置(以及垂直滚动)。

最佳答案

首先,您可能会觉得更简单。重新填充列表之前和重新填充强制列表控件之后,必须保存位置以更新新内容。

另外,您可能会考虑新内容可能具有不同数量的项目的事实,因此您必须相对于最大滚动位置设置位置。

示例代码如下:

    SCROLLINFO sbiBefore = { sizeof(SCROLLINFO) };
SCROLLINFO sbiAfter = { sizeof(SCROLLINFO) };

// get scroll info before
sbiBefore.fMask = SIF_ALL;
m_List.GetScrollInfo(SB_HORZ, &sbiBefore);

RenewContents();

// force control to redraw
int iCount = m_List.GetItemCount();
m_List.RedrawItems(0, iCount);

// get the scroll info after
sbiAfter.fMask = SIF_ALL;
m_List.GetScrollInfo(SB_HORZ, &sbiAfter);

double dRatio = (double)sbiAfter.nMax / sbiBefore.nMax;

// compute relative new position
sbiAfter.fMask = SIF_POS;
sbiAfter.nPos = dRatio * sbiBefore.nPos;

// set new position
BOOL bSet = m_List.SetScrollInfo(SB_HORZ, &sbiAfter);

我确信您可以用相同的方式处理垂直滚动。
在您提到的帖子中,因为您有更适当的方式来执行,所以使用EnsureVisible不必要地强制进行更新。
另外,如果最后一个项目已经可见,则不能使用“EnsureVisible”。

关于winapi - CListCtrl:如何保持水平滚动位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com