【问题标题】:Set horizontal scroll of CListBox row back after resetting content重置内容后将 CListBox 行的水平滚动设置回
【发布时间】:2015-03-03 08:32:11
【问题描述】:

我选择了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);

提前致谢!

编辑: 由于“rrrower”回答正确, lst.PostMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, 250), 0); 消息完成了这项工作。 horizScroll 的滚动位置完美运行。我建议发布此消息两次,因为如果您只执行一次,文本会从头到尾重新滚动到想要的位置。当您发布两次时,文本视觉上会停留在正确的位置,滚动条很快就会到达正确的位置。

【问题讨论】:

  • 只是一个简单的猜测,但是如果在设置滚动位置后使列表框无效会发生什么?

标签: c++ mfc visual-studio-2005 horizontal-scrolling clistbox


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,它有效!也感谢您介绍 Spy++,我不知道存在这样的东西,它甚至直接与 Visual Studio 一起安装。
【解决方案2】:

经过一番阅读,Invalidate 似乎应该可以解决问题。因为据我了解,您有一个文本行,这应该没问题,但是如果绘画本身很复杂并且需要资源,您可以使用ScrollWindowEx,然后在后者返回的矩形上使用InvalidateRect,仅重新绘制更改的区域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2015-10-30
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多