Есть программа, в ней формируется некий список документов и отображается только выделенный пункт. Программу можно найти в /var/ftp/pvt/Windows/Testing/RT/11054 Воспроизведение: Архив LocisSTD 1) Распаковать 2) зайти в каталог /ADM 3) запустить LCS_RUN.exe 4) выбрать запускаемый модуль, например "Склад (учет товаров)" - запустить В программе в меню выбрать "Учет товаров" -> "Реестр накладных" -> в низу справа нажать "ОК" Сформируется список накладных (окно не отрисовывается)
там прорисовывается пунктиром линия поверх кнопок, такая, как в listbox'е, таблица сделана именно в нем, поверх рисуются кнопки и т.п. (странно, что сделано так...) Видимо перерисовывается фон, на котором находится listbox, а сами его ячейки - нет.
ошибка в отрисовке происходит при выделении нового элемента, если выделенный элемент не меняется, то при прокручивании списка элементы не исчезают
выделение элемента в том списке происходит не стандартными средствами listbox'а, а самим автором программы, при этом видимо перерисовка фона происходит после перерисовки listbox'а
(In reply to comment #3) > выделение элемента в том списке происходит > не стандартными средствами listbox'а, а самим > автором программы, при этом видимо > перерисовка фона происходит после > перерисовки listbox'а > т.е. проблема с отрисовкой не решаема?
(In reply to comment #4) > (In reply to comment #3) > > выделение элемента в том списке происходит > > не стандартными средствами listbox'а, а самим > > автором программы, при этом видимо > > перерисовка фона происходит после > > перерисовки listbox'а > > > > т.е. проблема с отрисовкой не решаема? > я еще до конца не разобрался, сообщения о перерисовке приходят после того, как нарисованы все элементы, но что самое странное - выделенный элемент не затирается при этом. В общем, я еще поищу...
(In reply to comment #5) > (In reply to comment #4) > > (In reply to comment #3) > > > выделение элемента в том списке происходит > > > не стандартными средствами listbox'а, а самим > > > автором программы, при этом видимо > > > перерисовка фона происходит после > > > перерисовки listbox'а > > > > > > > т.е. проблема с отрисовкой не решаема? > > > > я еще до конца не разобрался, сообщения о > перерисовке приходят после того, как > нарисованы все элементы, но что самое > странное - выделенный элемент не > затирается при этом. В общем, я еще поищу... > добрый день есть какие-то результаты?
(In reply to comment #6) > (In reply to comment #5) > > (In reply to comment #4) > > > (In reply to comment #3) > > > > выделение элемента в том списке происходит > > > > не стандартными средствами listbox'а, а самим > > > > автором программы, при этом видимо > > > > перерисовка фона происходит после > > > > перерисовки listbox'а > > > > > > > > > > т.е. проблема с отрисовкой не решаема? > > > > > > > я еще до конца не разобрался, сообщения о > > перерисовке приходят после того, как > > нарисованы все элементы, но что самое > > странное - выделенный элемент не > > затирается при этом. В общем, я еще поищу... > > > > добрый день > есть какие-то результаты? > из результатов, если отключать стандартную перерисовку окна, то именно эта таблица работает правильно, следовательно может быть можно написать хак, чтобы для этого окна не обрабатывалось это сообщение. хотя это не лучший вариант.
я попробовал отключить InvalidateRect в dlls/user32/painting для ListBox'а - ошибка прорисовки остается только при создании этого контрола, дальше затирание исчезает.. но видимо тут лучше все-таки половить порядок сообщений, мне кажется в wine сообщение на InvalidateRect приходит позже, чем программа получает событие перерисовки, а в windows наоборот. Когда будет время, проверю через тест.
(In reply to comment #8) > я попробовал отключить InvalidateRect в > dlls/user32/painting для ListBox'а - ошибка прорисовки > остается только при создании этого > контрола, дальше затирание исчезает.. но > видимо тут лучше все-таки половить порядок > сообщений, мне кажется в wine сообщение на > InvalidateRect приходит позже, чем программа > получает событие перерисовки, а в windows > наоборот. Когда будет время, проверю через > тест. > ок если получится дайте знать..
посмотрел еще раз программу... Там один listbox находится внутри другого listbox'а с системным меню... Непонятно зачем, но возможно этим и вызван баг, попробовал убрать из InvalidateRect перерисовку только внутреннего listbox'а - тот же эфффект: >ошибка прорисовки остается только при создании >этого контрола, дальше затирание исчезает..
нашел нужное место для исправления, после этого вроде бы все правильно работает Решение (временное, нужно еще проверить на тесте и возможно поискать вызов RedrawWindow в listbox.cc): я отключаю перерисовку listbox'а в RedrawWindow в случае (!rect && !hrgn) (точнее по текту - else if(!hrgn) )
(In reply to comment #11) > нашел нужное место для исправления, после > этого вроде бы все правильно работает > Решение (временное, нужно еще проверить на > тесте и возможно поискать вызов RedrawWindow в > listbox.cc): > я отключаю перерисовку listbox'а в RedrawWindow в > случае (!rect && !hrgn) > (точнее по текту - else if(!hrgn) ) Добрый день когда можно будет протестировать так как тестовая лицензия на wine скоро заканчивается
отправил патч в wine-patches
(In reply to comment #13) > отправил патч в wine-patches > Добрый день раньше не пользовались Вашей службой поддержки подскажите как получить патч для тестирования? или откуда скачать?
Будет в следующем багфикс-релизе. Если хотите смотреть раньше, можно подписаться на рассылку wine-announce: http://lists.etersoft.ru/mailman/listinfo/wine-announce
посмотрел в других программах, нашел все-таки где это имправление мешает (натнулся в spy++, там пропала перерисовка дерева объектов), нужно будет поискать поглубже дальше
нашел другое решение, не вызывающей подобной проблемы - ненужный вызов происходит, когда listbox получает событие WM_ENABLE - вызывается InvalidateRect с нулевым прямоугольником, если этого не делать, то прорисовка везде нормальная. С другой стороны, по идее перерисовка по этому событию быть должна, не должно приходить это сообщение...
там последовательно вызываются WM_ENABLE с параметром false и true. Если это сделано автором программы, то возможно listbox делает что-то не то по этому событию, если же оно вызывается само при рисовании поверх listbox'а, то проблема какая-то более глобальная - почему оно вызывается?
WM_ENABLE приходит по-очереди двум listbox'ам, вначале внешнему, потом внутреннему. При этом перерисовка внутреннего в этой баге происходит позже, чем нужно. Если убрать вообще перерисовку внутренний listbox'а, то затирания нет, однако быть она должна (по логике изменение enable должно вызывать перерисовку). Т.е. тут нужно или делать хак, отменяющий прорисовку по WM_ENABLE в случае, когда родитель окна listbox, что вряд ли часто встречается и не должно вызвать проблем (хотя конечно неправильно), или возможно бага нерешаема из-за неправильной последовательности сообщений.
Илья, жду от тебя комментарий
Написал хак взамен старому, отправил в рассылку.
Принято. WINE@Etersoft 1.0.11 eter8.3/eter4