Bug 2350

Summary: Компас: Некорректная работа при количестве открытых документов более одного
Product: [Поддержка проектов] КОМПАС 3D Reporter: Виталий Булгаков <bulgakov>
Component: ТестированиеAssignee: Илья Шпигорь <shpigor>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: critical    
Priority: P2 CC: baraka, lav, mais, mx, pav, vostok
Version: v10   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 753    

Description Виталий Булгаков 2008-09-01 12:02:41 MSD
1. Запустить КОМПАС
2. Файл - Создать - Чертеж - Ок.
3. Повторить шаг 2.
4. Раскрыть меню, например, Файл. Затем, кликнуть в области документа
Меню свернется, но его часть останется неперерисованной поверх инструментальных панелей
5. Сервис - Параметры.
Ожидаемый результат: поднимается диалог Параметры
Фактически: Компас зависает
Comment 1 Илья Шпигорь 2008-09-11 15:00:17 MSD
Ошибка наблюдается в случае, когда окна документов maximized. 

Возможно, проблема в MFC функции CWinApp::OnIdle(). При ожидании происходит постоянная посылка WM_MDIGETACTIVE сообщений MDIClient'у. Передаваемый lParam является указателем типа BOOL. Этой переменной присваивается TRUE, если окно maximized. Похоже, что в эта перемнная как-то используется, для определения состояния ожидания.

В случае если переменную lParam игнорировать или присваивать ей всегда FALSE, ошибка не наблюдается.


Comment 2 Илья Шпигорь 2008-09-12 13:01:32 MSD
Выложил патч. 

Он заключается в том, что переменная lParam для сообщения WM_MDIGETACTIVE игнорируется, если число child окон стало больше одного.
Comment 3 Анатолий Лютин 2008-09-12 13:19:28 MSD
Возможно повлияет на работу окон 1с, посмотри предпоследнюю багу про неправильное возвращение к предыдущему окну в 1с.
Comment 4 Илья Шпигорь 2008-09-12 13:58:42 MSD
Патч имеет побочный эффект. Начиная со второго child окна каждое следующее создается максимизированным. 
Решение нужно пересмотреть.
Comment 5 Илья Шпигорь 2008-09-12 15:15:31 MSD
Выложил патч [TRY 2].

Для определения состояния ожидания ввел флаг MDIF_IDLE. Он устанавливается в результате последовательности WM_MDIGETACTIVE сообщений с определнными lParam:
1) передача одного и того же адреса в lParam
2) передача одного и того же адреса в lParam чередуется с lParam = NULL

Флаг сбрасывается как только WM_MDIGETACTIVE передает lParam с адресом отличным от предыдущего.

Возможны случаи блокировки и корректных WM_MDIGETACTIVE запросов, но побочных эффектов пока не обнаружено (багу с неправильным возвращением к предыдущему
окну не ломает).

Можно доработать алгоритм, чтобы устанавливать флаг после получения определнного числа одних и тех же признаков (например 3-х). Это исключит ложные срабатывания, но немного усложнит решение.
Comment 6 Денис Баранов 2008-09-17 19:53:42 MSD
На последней сборке eter22 не воспроизвелось.