mfc中clistctrl列表控件实现刷新后自动滚动到刷新前的疑惑

时间:2022-09-21 20:14:21
clistctrl是REPORT样式的
是定时刷新的,
刷新前将其滚动到某个位置
刷新后会回到第一行

有人说用EnsureVisible,可是刷新前我只进行了滚动操作
没有选定任何一行,我去EnsureVisible哪一行呢?
哪一行都不大好吧

还有就是用getScrollPos+setScrollPos
可是滚动条是滚动了,数据区的第一行也跟着往下走,仍然显示,而第一行数据往上却由多行空白

第三种是getScrollPos+Srcoll
这个确实可以滚动,但是getScrollPos得到的是行为单位,
而scroll却需要以像素为单位,如何计算!!
(我试过用getScrollPos乘以10,但是并不准确,每次都会少滚动一些)

这个问题我在网上搜了一晚上,我虽然不是个编程高手
但是搜索的本领还行
CSDN上也有很多这样的提问,但是只有提问没有答案
我希望真正懂的人回答我,
越详细越好!
而不是从网上考一堆垃圾给我
跟不是不加思索的说两三个字

我想这只是很基本,很必须得问题,就像任务管理器,不管怎么刷新,我们依然看到同样的那几行,而不会跑到第一行是吧


8 个解决方案

#1


第三种办法 用GetItemRect得到行高

#2


CListCtrl::GetTopIndex
CListCtrl::GetCountPerPage
CListCtrl::EnsureVisible

#3


你怎么刷新数据的啊?ReDrawItems?

#4


每次OnTimer都先DeleteAllItems,然后重新InsertItem

#5


int n = pmyListCtrl->GetTopIndex();
int nLast = n + pmyListCtrl->GetCountPerPage();
m_pmyListCtrl->EnsureVisible(nLast-1,TRUE);

我实现了,是这样的吧
太好了
虽然您说的不是很详细,但是我还是找到了正确的方法
感谢

#6


就算得到行高,滚动的时候并不能滚动整数行,可是我们只能为Scroll计算出整数行,零头怎么算???

#7


好贴~

#8


引用 5 楼  的回复:
int n = pmyListCtrl->GetTopIndex();
int nLast = n + pmyListCtrl->GetCountPerPage();
m_pmyListCtrl->EnsureVisible(nLast-1,TRUE);

我实现了,是这样的吧
太好了
虽然您说的不是很详细,但是我还是找到了正确的方法
感谢

确实可行,也解决了我的问题,非常感谢

#1


第三种办法 用GetItemRect得到行高

#2


CListCtrl::GetTopIndex
CListCtrl::GetCountPerPage
CListCtrl::EnsureVisible

#3


你怎么刷新数据的啊?ReDrawItems?

#4


每次OnTimer都先DeleteAllItems,然后重新InsertItem

#5


int n = pmyListCtrl->GetTopIndex();
int nLast = n + pmyListCtrl->GetCountPerPage();
m_pmyListCtrl->EnsureVisible(nLast-1,TRUE);

我实现了,是这样的吧
太好了
虽然您说的不是很详细,但是我还是找到了正确的方法
感谢

#6


就算得到行高,滚动的时候并不能滚动整数行,可是我们只能为Scroll计算出整数行,零头怎么算???

#7


好贴~

#8


引用 5 楼  的回复:
int n = pmyListCtrl->GetTopIndex();
int nLast = n + pmyListCtrl->GetCountPerPage();
m_pmyListCtrl->EnsureVisible(nLast-1,TRUE);

我实现了,是这样的吧
太好了
虽然您说的不是很详细,但是我还是找到了正确的方法
感谢

确实可行,也解决了我的问题,非常感谢