Bug 2234

Summary: Гарант: Не прорисовывается checkbox
Product: WINE@Etersoft Reporter: Виталий Перов <vitperov>
Component: Окна / фокус / перерисовкаAssignee: Илья Шпигорь <shpigor>
Status: CLOSED FIXED QA Contact: Andrey Vusik <night>
Severity: minor    
Priority: P4 CC: baraka, lav, night, pav
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 769, 1074, 3932    

Description Виталий Перов 2008-08-08 14:37:35 MSD
При завершении мастера установки Гарант7 появляется финальный диалог. Там должен стоять checkbox слева от надписи "Запустить утилиту...".
Checkbox прорисовывается только если попасть в него мышкой.
При перекрытии этого окна другим окном checkbox опять пропадает

Пока работает только локальная версия Гарант7. Установку следует запускать через winexp
Comment 1 Анатолий Лютин 2008-08-12 11:16:01 MSD
В общем ошибку заценил..

Такое ощущение, что msi эту кнопку рисует под клиентским окном, т.к. spy его в wine не видит, а в WIndows без проблем.

Стиль: 0x50032002
Comment 2 Анатолий Лютин 2008-08-12 16:52:28 MSD
Проблема похоже в static-е ( SS_BITMAP ), он перерисовывает и закрывает собой этот checkbox, очень похоже на проблему с 1с 7.7 ( окно "О программе", когда там текст зарисовывался ).
Comment 3 Илья Шпигорь 2008-12-18 14:26:31 MSK
Выложил патч.

Как писал Толя, проблема заключалась в bitmap static'e, который при отрисовке закрывал ранее нарисованный checkbox.

Решение состоит в том, чтобы после отрисовки bitmap static'a посылать WM_PAINT тем контролам, которые перекрываются этим static'ом.

Думаю, что решение, не требующее перебора окон, вряд ли существует. Дело в том, что bitmap static может рисоваться по WM_PAINT, посланными из приложения, поэтому отслеживать порядок отрисовки всех контролов окна бесполезно.
Comment 4 Денис Баранов 2008-12-18 19:39:09 MSK
С данным патчем ошибка не воспроизвелась.
Comment 5 Илья Шпигорь 2009-01-12 10:57:35 MSK
У текущего решения есть проблема - перестал работать установщик FineReader. Происходит постоянная перерисовка и приложение виснет.

Патч надо доработать.
Comment 6 Илья Шпигорь 2009-01-12 12:02:09 MSK
Проблема текущего решения, заключается в том, что если static находится поверх како-нибудь контрола-родителя, то из-за посылки ему WM_PAINT по отрисовки static'a получается зацикливание.
Comment 7 Илья Шпигорь 2009-01-12 12:20:14 MSK
Выложил дополнение к патчу - [2/2].

Добавлена проверка на класс контрола, который необходимо перерисовать. Класс должен быть Button.

Протестировать установку FineReader можно в бутылке fr/install.
Comment 8 Andrey Vusik 2009-01-30 16:52:30 MSK
40/17
С установкой FR проблемы не наблюдал
Comment 9 Илья Шпигорь 2009-09-21 14:04:05 MSD
При тестировании было замечено, что патчи на эту багу стали не нужны.

Думаю имеет смысл их откатить, т.к. они приводят к лишней перерисовке контролов.

Выложил 2 revert'а.

Необходимо протестировать, что бага не воспроизводится на багфиксе 1.0.11.
Comment 10 Andrey Vusik 2009-09-24 19:33:54 MSD
WINE@Etersoft 1.0 SQL 1.0.11-eter8.3/4

Not working!
Comment 11 Илья Шпигорь 2009-09-25 13:31:26 MSD
Выложил патч [TRY 2].

На самом деле, проблема в создании контролов msi диалога. Они перерисовываются в порядке обратном порядку создания. Т.е. если сначала создается Bitmap, а потом CheckBox, то они перерисовываются - CheckBox, затем Bitmap. Очевидно, что CheckBox в этом случае будет перекрываться Bitmap'ом.

Порядок создания этих контролов определяется результатом SQL запроса к msi пакету в функции msi_dialog_fill_controls. Если в этот запрос добавить упорядочивание по типу, то тогда Bitmap'ы будут всегда создаваться в последнюю очередь (после контролов PushButton, CheckBox, Text). В этом случае они наверняка не будут ничего перекрывать.

В windows порядок создания контролов отличается от wine'овского. Чтобы однозначно его установить надо написать тест.
Comment 12 Andrey Vusik 2010-12-10 18:24:22 MSK
Принято.