C++ 重置内容后,将CListBox行的水平滚动设置回原位

C++ 重置内容后,将CListBox行的水平滚动设置回原位,c++,mfc,visual-studio-2005,horizontal-scrolling,clistbox,C++,Mfc,Visual Studio 2005,Horizontal Scrolling,Clistbox,我得到了一个多重选择CListBox,水平滚动条已启用并正确显示。问题是,当我使用函数 lst.ResetContent()并重新填充,我找不到将行中的文本滚动回同一位置的方法。我试着用 lst.SetScrollPos(SB_-HORZ,horizScroll,TRUE),其中horizScroll=lst.GetScrollPos(SB_HORZ)这在滚动条本身上正常工作,但 行中的文本保持不滚动(手动滚动功能正常) 我的课程结构如下: CListBox lst; int horizScro

我得到了一个多重选择
CListBox
,水平滚动条已启用并正确显示。问题是,当我使用函数

lst.ResetContent()
并重新填充,我找不到将行中的文本滚动回同一位置的方法。我试着用

lst.SetScrollPos(SB_-HORZ,horizScroll,TRUE),其中
horizScroll
=
lst.GetScrollPos(SB_HORZ)这在滚动条本身上正常工作,但

行中的文本保持不滚动(手动滚动功能正常)

我的课程结构如下:

CListBox lst;
int horizScroll;

/*Periodically doing code bellow*/
//Get current scroll position
horizScroll = lst.GetScrollPos(SB_HORZ);
//Reset current content
lst.ResetContent();
//Add item into CListBox (UNICODE in my application)
lst.AddString(L"Some longer text then width of CListBox");
//Calculate horizontal extent and set it through  
lst.SetHorizontalExtent(calculatedWidth); 
//Try to scroll text (scrolls only scroll bar, not text itself)
lst.SetScrollPos(SB_HORZ, horizScroll, TRUE);
UpdateData(FALSE);
提前谢谢

编辑: 由于“rrirower”回答正确,
lst.PostMessage(WM_HSCROLL,MAKEWPARAM(SB_THUMBPOSITION,250),0)

信息起作用。从
horizScroll
滚动位置可以完美工作。我建议将此消息发布两次,因为如果您只发布一次,则文本将从开始位置以可视方式重新滚动到所需位置。当你发布两次后,文本在视觉上保持在正确的位置,滚动条很快就会到达正确的位置。

阅读一段时间后,似乎应该可以做到这一点。据我所知,你只有一行文字,这应该没问题,但是如果绘画本身很复杂,需要资源,你可以使用,然后在后者返回的矩形上只重新绘制更改的区域。

如果我理解正确,您正在尝试使用程序代码水平滚动列表框中的文本。如果您使用Spy++,您将看到当您使用鼠标手动滚动时,一系列消息将发布到列表框控件。你可以通过这样做来完成同样的事情

lst.PostMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, 250), 0);

您需要计算位置(我在上面使用了250),但是,上面的代码应该水平移动文本和滚动条。

只是一个快速猜测,但是如果在设置滚动位置后使列表框无效会发生什么?非常感谢,它可以工作!同样感谢您讲述Spy++,我不知道有这样的东西存在,甚至它是直接用VisualStudio安装的。