Bug 4222

Summary: Не отрисовывается список документов
Product: WINE@Etersoft Reporter: Денис Баранов <baraka>
Component: Окна / фокус / перерисовкаAssignee: Иван Дончевский <yv>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: minor    
Priority: P3 CC: lav, luchinin, shpigor
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: 11054 Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 3932    

Description Денис Баранов 2009-08-17 12:01:46 MSD
Есть программа, в ней формируется некий список документов и отображается только выделенный пункт.
Программу можно найти в /var/ftp/pvt/Windows/Testing/RT/11054
Воспроизведение:
Архив LocisSTD
1) Распаковать 
2) зайти в каталог /ADM
3) запустить LCS_RUN.exe
4) выбрать запускаемый модуль, например "Склад (учет товаров)" - запустить
В программе в меню выбрать "Учет товаров" -> "Реестр накладных" -> в низу справа нажать "ОК"
Сформируется список накладных (окно не отрисовывается)
Comment 1 Иван Дончевский 2009-08-19 15:56:39 MSD
там прорисовывается пунктиром линия поверх кнопок, такая, как в listbox'е, таблица сделана именно в нем, поверх рисуются кнопки и т.п. (странно, что сделано так...) Видимо перерисовывается фон, на котором находится listbox, а сами его ячейки - нет.
Comment 2 Иван Дончевский 2009-08-19 16:55:04 MSD
ошибка в отрисовке происходит при выделении нового элемента, если выделенный элемент не меняется, то при прокручивании списка элементы не исчезают
Comment 3 Иван Дончевский 2009-08-19 17:15:24 MSD
выделение элемента в том списке происходит не стандартными средствами listbox'а, а самим автором программы, при этом видимо перерисовка фона происходит после перерисовки listbox'а
Comment 4 luchinin 2009-08-20 14:24:13 MSD
(In reply to comment #3)
> выделение элемента в том списке происходит
> не стандартными средствами listbox'а, а самим
> автором программы, при этом видимо
> перерисовка фона происходит после
> перерисовки listbox'а
> 

т.е. проблема с отрисовкой не решаема?
Comment 5 Иван Дончевский 2009-08-20 16:48:03 MSD
(In reply to comment #4)
> (In reply to comment #3)
> > выделение элемента в том списке происходит
> > не стандартными средствами listbox'а, а самим
> > автором программы, при этом видимо
> > перерисовка фона происходит после
> > перерисовки listbox'а
> > 
> 
> т.е. проблема с отрисовкой не решаема?
> 

я еще до конца не разобрался, сообщения о перерисовке приходят после того, как нарисованы все элементы, но что самое странное - выделенный элемент не затирается при этом. В общем, я еще поищу...
Comment 6 luchinin 2009-08-25 08:38:57 MSD
(In reply to comment #5)
> (In reply to comment #4)
> > (In reply to comment #3)
> > > выделение элемента в том списке происходит
> > > не стандартными средствами listbox'а, а самим
> > > автором программы, при этом видимо
> > > перерисовка фона происходит после
> > > перерисовки listbox'а
> > > 
> > 
> > т.е. проблема с отрисовкой не решаема?
> > 
> 
> я еще до конца не разобрался, сообщения о
> перерисовке приходят после того, как
> нарисованы все элементы, но что самое
> странное - выделенный элемент не
> затирается при этом. В общем, я еще поищу...
> 

добрый день
есть какие-то результаты?
Comment 7 Иван Дончевский 2009-08-26 14:52:26 MSD
(In reply to comment #6)
> (In reply to comment #5)
> > (In reply to comment #4)
> > > (In reply to comment #3)
> > > > выделение элемента в том списке происходит
> > > > не стандартными средствами listbox'а, а самим
> > > > автором программы, при этом видимо
> > > > перерисовка фона происходит после
> > > > перерисовки listbox'а
> > > > 
> > > 
> > > т.е. проблема с отрисовкой не решаема?
> > > 
> > 
> > я еще до конца не разобрался, сообщения о
> > перерисовке приходят после того, как
> > нарисованы все элементы, но что самое
> > странное - выделенный элемент не
> > затирается при этом. В общем, я еще поищу...
> > 
> 
> добрый день
> есть какие-то результаты?
> 

из результатов, если отключать стандартную перерисовку окна, то именно эта таблица работает правильно, следовательно может быть можно написать хак, чтобы для этого окна не обрабатывалось это сообщение. хотя это не лучший вариант.
Comment 8 Иван Дончевский 2009-08-26 15:46:39 MSD
я попробовал отключить InvalidateRect в dlls/user32/painting для ListBox'а - ошибка прорисовки остается только при создании этого контрола, дальше затирание исчезает.. но видимо тут лучше все-таки половить порядок сообщений, мне кажется в wine сообщение на InvalidateRect приходит позже, чем программа получает событие перерисовки, а в windows наоборот. Когда будет время, проверю через тест.
Comment 9 luchinin 2009-08-27 07:16:59 MSD
(In reply to comment #8)
> я попробовал отключить InvalidateRect в
> dlls/user32/painting для ListBox'а - ошибка прорисовки
> остается только при создании этого
> контрола, дальше затирание исчезает.. но
> видимо тут лучше все-таки половить порядок
> сообщений, мне кажется в wine сообщение на
> InvalidateRect приходит позже, чем программа
> получает событие перерисовки, а в windows
> наоборот. Когда будет время, проверю через
> тест.
> 

ок
если получится дайте знать..
Comment 10 Иван Дончевский 2009-08-31 16:25:53 MSD
посмотрел еще раз программу... Там один listbox находится внутри другого listbox'а с системным меню... Непонятно зачем, но возможно этим и вызван баг, 

попробовал убрать из InvalidateRect перерисовку только внутреннего listbox'а - тот же эфффект:
>ошибка прорисовки остается только при создании
>этого контрола, дальше затирание исчезает..
Comment 11 Иван Дончевский 2009-08-31 17:18:29 MSD
нашел нужное место для исправления, после этого вроде бы все правильно работает
Решение (временное, нужно еще проверить на тесте и возможно поискать вызов RedrawWindow в listbox.cc):
я отключаю перерисовку listbox'а в RedrawWindow в случае (!rect && !hrgn)

(точнее по текту - else if(!hrgn) )
Comment 12 luchinin 2009-09-01 07:03:35 MSD
(In reply to comment #11)
> нашел нужное место для исправления, после
> этого вроде бы все правильно работает
> Решение (временное, нужно еще проверить на
> тесте и возможно поискать вызов RedrawWindow в
> listbox.cc):
> я отключаю перерисовку listbox'а в RedrawWindow в
> случае (!rect && !hrgn)
> (точнее по текту - else if(!hrgn) )

Добрый день
когда можно будет протестировать
так как тестовая лицензия на wine скоро заканчивается
Comment 13 Иван Дончевский 2009-09-02 18:43:41 MSD
отправил патч в wine-patches
Comment 14 luchinin 2009-09-03 07:22:41 MSD
(In reply to comment #13)
> отправил патч в wine-patches
> 

Добрый день
раньше не пользовались Вашей службой поддержки
подскажите как получить патч для тестирования?
или откуда скачать?
Comment 15 Vitaly Lipatov 2009-09-03 12:44:16 MSD
Будет в следующем багфикс-релизе. Если хотите смотреть раньше, можно подписаться на рассылку wine-announce:
http://lists.etersoft.ru/mailman/listinfo/wine-announce
Comment 16 Иван Дончевский 2009-09-08 19:30:31 MSD
посмотрел в других программах, нашел все-таки где это имправление мешает (натнулся в spy++, там пропала перерисовка дерева объектов), нужно будет поискать поглубже дальше
Comment 17 Иван Дончевский 2009-09-08 20:45:05 MSD
нашел другое решение, не вызывающей подобной проблемы - ненужный вызов происходит, когда listbox получает событие WM_ENABLE - вызывается InvalidateRect с нулевым прямоугольником, если этого не делать, то прорисовка везде нормальная. С другой стороны, по идее перерисовка по этому событию быть должна, не должно приходить это сообщение...
Comment 18 Иван Дончевский 2009-09-08 21:02:39 MSD
там последовательно вызываются WM_ENABLE с параметром false и true. Если это сделано автором программы, то возможно listbox делает что-то не то по этому событию, если же оно вызывается само при рисовании поверх listbox'а, то проблема какая-то более глобальная - почему оно вызывается?
Comment 19 Иван Дончевский 2009-09-09 17:21:50 MSD
WM_ENABLE приходит по-очереди двум listbox'ам, вначале внешнему, потом внутреннему. При этом перерисовка внутреннего в этой баге происходит позже, чем нужно. Если убрать вообще перерисовку внутренний listbox'а, то затирания нет, однако быть она должна (по логике изменение enable должно вызывать перерисовку). Т.е. тут нужно или делать хак, отменяющий прорисовку по WM_ENABLE в случае, когда родитель окна listbox, что вряд ли часто встречается и не должно вызвать проблем (хотя конечно неправильно), или возможно бага нерешаема из-за неправильной последовательности сообщений.
Comment 20 Vitaly Lipatov 2009-09-09 17:31:53 MSD
Илья, жду от тебя комментарий
Comment 21 Иван Дончевский 2009-09-09 17:45:34 MSD
Написал хак взамен старому, отправил в рассылку.
Comment 22 Денис Баранов 2009-09-24 19:41:24 MSD
Принято.
WINE@Etersoft 1.0.11 eter8.3/eter4