重置内容后设置 CListBox 行的水平滚动
Set horizontal scroll of CListBox row back after resetting content
我得到了多项选择 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
的滚动位置效果很好。我建议 post 将此消息发送两次,因为如果只执行一次,文本会从头开始重新滚动到所需位置。当您 post 两次时,文本在视觉上停留在正确的位置,滚动条很快就会到达正确的位置。
经过一些阅读,后者返回的矩形上似乎 Invalidate should do the trick. Since as I understand you have one text line this should be fine, however if the painting itself is complex and requires resources you can use ScrollWindowEx and then InvalidateRect 仅重绘更改的区域。
如果我没理解错的话,您是在尝试使用程序代码水平滚动列表框中的文本。如果您使用 Spy++,您会看到当您使用鼠标手动滚动时,一系列 WM_HSCROLL 消息被发送到列表框控件。你可以通过这样做来完成同样的事情...
lst.PostMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, 250), 0);
你需要计算位置(我上面用了250),但是,上面的代码应该水平移动文本和滚动条
我得到了多项选择 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
的滚动位置效果很好。我建议 post 将此消息发送两次,因为如果只执行一次,文本会从头开始重新滚动到所需位置。当您 post 两次时,文本在视觉上停留在正确的位置,滚动条很快就会到达正确的位置。
经过一些阅读,后者返回的矩形上似乎 Invalidate should do the trick. Since as I understand you have one text line this should be fine, however if the painting itself is complex and requires resources you can use ScrollWindowEx and then InvalidateRect 仅重绘更改的区域。
如果我没理解错的话,您是在尝试使用程序代码水平滚动列表框中的文本。如果您使用 Spy++,您会看到当您使用鼠标手动滚动时,一系列 WM_HSCROLL 消息被发送到列表框控件。你可以通过这样做来完成同样的事情...
lst.PostMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, 250), 0);
你需要计算位置(我上面用了250),但是,上面的代码应该水平移动文本和滚动条