BUG: ScrollWindowEx smoothscrolling !!!, CListBox+child wnds
От: Nalik  
Дата: 12.12.04 13:02
Оценка:
Уважаемые господа программисты !

Необходимо сделать smoothscroll в CListBox, который содержит дочерние окна (например кнопки), но при этом использовать

standard scrollbar (который есть у каждого окна по-умолчанию).

Проблема: в процессе плавной прокрутки (весь цикл смещения на высоту элемента вверх или вниз разбивается на несколько

тактов) появляется копия внедрённой кнопки в смещённых координатах и двигается вместе с оригиналом... в реалтайме это

выглядит так, что проскакивает какая-то фигня при прокрутке.

Что я делаю:
1. Создаю CListBox.
2. Набиваю элементами и дочерними окнами (кнопками).
3. Перехватываю события WM_MOVE у каждой кнопки (которое отсылается из функции ScrollWindowEx в недрах standard scroll

bara, который по-умолчанию прилеплен к любому CommonContorl'у (известно, что при включенном smooth scrolle, эта функция

разбивает процесс скроллинга на несколько тактов с задержками)).
4. Оказывается, что между приходом первого WM_MOVE и следующим тактом smoothscroll-инга что-то ляпает мне мои дочерние окна

по смещённым координатам (причём ниже родных координат где-то на 150% высоты кнопки, да ещё и вправо сдвигает на пару

пикселей).
5. На втором такте WM_MOVE я пытался сделать pParent->RedrawWindow(), this->RedrawWindow(). Работает, пока я ещё в

обработчике кнопочного WM_MOVE'a... после ухода в недра выньды — опять ляпа... (но уже смещённая на 1 пиксель — урра !!! — в

Microsoft продумали всё до мелочей, и решили, что это неправильно оставлять изменившиеся окна без надзора).
6. Дальше — больше. Ляпа начинает ползти вверх вместе с находящимся почти над ним настоящим изображением кнопки.
7. В итоге получаем нашу кнопку, которая кое-как доползла до нового места, ну и ессесно её копию прямо под ней и правее на

пару пикселов).

www.codeguru.com — нет решения (есть похожие примеры, но там тот же глюк)
www.codeproject.com — нет решения
www.rsdn.ru — ...
... — ...
www.google.com — нет похожих ситуаций.....

Впринципе, если перехватить в CListBox ещё и WM_VSCROLL, да перед отдачей управления родному окну поставить всем дочерним

кнопкам SetRedraw(0), а потом у них в WM_MOVE поставить SetRedraw(1), причём без всяких pParent->RedrawWindow() и

this->RedrawWindow(), — тогда всё работает, но при этом кнопка мерцает при прокрутке....


Вопрос на засыпку:
Как мне сделать нормальный List, который может содержать кнопки, которые бы прокручивалися вместе со строками этого List

???

Откройте священную тайну !!!

АААА !!!! Помогите кто-нибудь....

Неужели писать свой CNormalSmoothScroll ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.