Report样式的CListView无法滚动到指定行

firefly3233 2011-12-14 05:54:27
用WM_VSCROLL来实现Report样式的CListView滚动到指定行(如100行).
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_THUMBPOSITION,100),NULL);
不成功。但:
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),NULL);//可以成功下滚1行。

::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_PAGEDOWN,0),NULL);//可以成功下滚1页。

::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_BOTTOM,0),NULL);//可以成功滚动到屏底。

但就是滚动不到指定行.

跟踪用鼠标拖滚动条时,进入了WM_VSCROLL消息响应函数4次:
nSBCode = SB_THUMBTRACK , nPos = 0
nSBCode = SB_THUMBTRACK, nPos = 100
nSBCode = SB_ THUMBPOSITION, nPos = 100
nSBCode = SB_ENDSCROLL, nPos = 0

模拟同样的参数发送了四次WM_VSCROLL消息:
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_THUMBTRACK,0),NULL);//
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_THUMBTRACK,100),NULL);//
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_THUMBPOSITION,100),NULL);//
::SendMessage(m_hWnd,WM_VSCROLL,MAKEWPARAM(SB_ENDSCROLL,0),NULL);//

进入了WM_VSCROLL消息响应函数跟踪的结果同上,但就是不滚屏,什么原因呀?
...全文
114 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
firefly3233 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 heksn 的回复:]
可以用EnsureVisible
[/Quote]
EnsureVisible是可以,但如果是向下滚,要到达的项只会显示在最底部,向上滚,才会显示在顶部。
我要的是始终显示在顶住(以引起人注意)
用以下方法可以解决:

int i = 100;
CRect rc;
GetItemRect(i - 1, &rc, LVIR_BOUNDS);
Scroll(CSize(0, rc.top));
firefly3233 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 heksn 的回复:]
SetScrollPos完强制刷新一下呢
[/Quote]
强制刷新不行的。LISTVIEW里有个Scroll方法,估计是达到上述要求,才专设的。我用了,确实管用:

int i = 100;
CRect rc;
GetItemRect(i - 1, &rc, LVIR_BOUNDS);
Scroll(CSize(0, rc.top));

  • 打赏
  • 举报
回复
可以用EnsureVisible
  • 打赏
  • 举报
回复
SetScrollPos完强制刷新一下呢
firefly3233 2011-12-14
  • 打赏
  • 举报
回复
假窗口?有WM_HSCROLL和WM_VSCROLL样式的窗口,当内容超过满过窗口大小时,会自动加上滚动条的.
我用SetScrollPos(m_hWnd, SB_VERT, 100)试过了,可以设置滚动条到100行的位置,但窗口的内容还是原样不动的。
我也知道别的控件,可以用SB_THUMBPOSITION的,但不知ListView为啥不行?一行,一页,到底,都没问题呀?可能还是有原因的,我想应该能解决的。
yuucyf 2011-12-14
  • 打赏
  • 举报
回复
CListCtrl控件自带的滚动条并不是CScrollBar控件,而是自己画上去的假窗口,因此实际上是通过CListCtrl的 GetScrollInfo和SetScrollInfo函数完成了滚动条位置信息的查询和设置.
调用SetScrollInfo试试.

如果是CListBox和CTree,这样调用
SendMessage(WM_VSCROLL, MAKELONG(SB_THUMBPOSITION, 10),NULL);
都是可以,楼主可以试试看?
firefly3233 2011-12-14
  • 打赏
  • 举报
回复
我只是用来跟踪查看参数值的,有没有这段代码,效果是一样的。
firefly3233 2011-12-14
  • 打赏
  • 举报
回复
不是这个代码有问题。
是因为成功不了,我只简单重载一下,来查看参数值,是默认的。
void MyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}
yuucyf 2011-12-14
  • 打赏
  • 举报
回复
把WM_VSCROLL消息响应函数贴出来看看?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧