1. Запустить КОМПАС 2. Файл - Создать - Чертеж - Ок. 3. Повторить шаг 2. 4. Раскрыть меню, например, Файл. Затем, кликнуть в области документа Меню свернется, но его часть останется неперерисованной поверх инструментальных панелей 5. Сервис - Параметры. Ожидаемый результат: поднимается диалог Параметры Фактически: Компас зависает
Ошибка наблюдается в случае, когда окна документов maximized. Возможно, проблема в MFC функции CWinApp::OnIdle(). При ожидании происходит постоянная посылка WM_MDIGETACTIVE сообщений MDIClient'у. Передаваемый lParam является указателем типа BOOL. Этой переменной присваивается TRUE, если окно maximized. Похоже, что в эта перемнная как-то используется, для определения состояния ожидания. В случае если переменную lParam игнорировать или присваивать ей всегда FALSE, ошибка не наблюдается.
Выложил патч. Он заключается в том, что переменная lParam для сообщения WM_MDIGETACTIVE игнорируется, если число child окон стало больше одного.
Возможно повлияет на работу окон 1с, посмотри предпоследнюю багу про неправильное возвращение к предыдущему окну в 1с.
Патч имеет побочный эффект. Начиная со второго child окна каждое следующее создается максимизированным. Решение нужно пересмотреть.
Выложил патч [TRY 2]. Для определения состояния ожидания ввел флаг MDIF_IDLE. Он устанавливается в результате последовательности WM_MDIGETACTIVE сообщений с определнными lParam: 1) передача одного и того же адреса в lParam 2) передача одного и того же адреса в lParam чередуется с lParam = NULL Флаг сбрасывается как только WM_MDIGETACTIVE передает lParam с адресом отличным от предыдущего. Возможны случаи блокировки и корректных WM_MDIGETACTIVE запросов, но побочных эффектов пока не обнаружено (багу с неправильным возвращением к предыдущему окну не ломает). Можно доработать алгоритм, чтобы устанавливать флаг после получения определнного числа одних и тех же признаков (например 3-х). Это исключит ложные срабатывания, но немного усложнит решение.
На последней сборке eter22 не воспроизвелось.