2015-03-03 67 views
1

我得到了多个选择CListBox,水平滚动条启用并正确显示。问题是,当我使用功能重置内容后设置CListBox行的水平滚动

lst.ResetContent()并填充它,我无法找到方法滚动行中的文本回到相同的位置。我试图用

lst.SetScrollPos(SB_HORZ, horizScroll, TRUE);,其中horizScroll = lst.GetScrollPos(SB_HORZ);这正确工作的滚动条本身上,但该行中

文本撑不滚动(手动滚动功能OK)。我的程序的

结构是:提前

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完美运作。我建议两次发布这条消息,因为如果你只做一次,文本会从开始到想要的位置在视觉上重新滚动。当您将文章张贴两次时,文字会保持在正确的位置,并且滚动条会很快到达正确的位置。

+0

只是一个快速猜测,但如果在设置滚动位置后使列表框失效,会发生什么? – 2015-03-03 08:54:26

回答

1

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

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

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

+0

非常感谢,它的作品!另外感谢告诉Spy ++,我不知道这样的东西存在,它甚至直接用Visual Studio安装。 – Mischo5500 2015-03-04 11:55:00

1

经过一番阅读,似乎Invalidate应该做的伎俩。因为据我所知你有一条文本行应该没问题,但是如果绘画本身很复杂并且需要资源,你可以在由后者返回的矩形上使用ScrollWindowEx,然后InvalidateRect重新绘制仅改变的区域。

相关问题