2015-03-03 4 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); 

Заранее спасибо!

EDIT: Как "rrirower" ответил правильно, lst.PostMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, 250), 0); сообщение делает работу. Позиция прокрутки от horizScroll работает отлично. Я предлагаю отправить это сообщение дважды, потому что, если вы делаете это только один раз, текст прокручивается визуально от начала до желаемой позиции. Когда вы отправляете его дважды, текст визуально остается в правильном положении, а полоса прокрутки быстро приближается к нужному месту.

+0

Просто быстро догадайтесь, но что произойдет, если вы аннулируете окно списка после установки положения прокрутки? –

ответ

1

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

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

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

+0

Большое спасибо, это работает! Также спасибо за рассказ о Spy ++, я не знал, что что-то подобное существует, и даже устанавливается непосредственно с Visual Studio. – Mischo5500

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^