Установить горизонтальную прокрутку строки CListBox назад после сброса содержимого

Я получил множественный выбор 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 работает отлично. Я предлагаю опубликовать это сообщение дважды, потому что, если вы делаете это только один раз, текст визуально прокручивается с начала до требуемой позиции. Когда вы публикуете его дважды, текст визуально остается в правильном положении, а полоса прокрутки просто быстро попадает в нужное место.

2 ответа

Решение

Если я вас правильно понимаю, вы пытаетесь прокрутить текст в окне списка по горизонтали, используя программный код. Если вы используете Spy++, вы увидите, что при ручной прокрутке с помощью мыши серия сообщений WM_HSCROLL публикуется в элемент управления списком. Вы можете сделать то же самое, сделав это...

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

Вам нужно рассчитать позицию (я использовал 250 выше), но приведенный выше код должен переместить текст и полосу прокрутки по горизонтали.

После некоторого чтения кажется, что Invalidate должен сделать свое дело. Поскольку, как я понимаю, у вас есть одна текстовая строка, это должно быть хорошо, однако, если сама живопись сложна и требует ресурсов, вы можете использовать ScrollWindowEx и затем InvalidateRect в прямоугольнике, возвращаемом последним, чтобы перекрасить только измененную область.

Другие вопросы по тегам