Если вы хотите показать UI модально, вам нужно отключить (disable) владельца (owner window в терминах WinAPI) и включить (enable) модальное дочернее окно, плюс сделать всё наоборот, когда модальное окно закрывается (*).
И если вы что-то сделаете неправильно, то клавиатурный фокус будет вытворять странные вещи.
Когда вы закрываете модальный диалог, вы, скорее всего, захотите выполнить очистку в таком порядке:
- Уничтожить модальный диалог.
- Включить заново владельца.
Что же происходит?
Когда вы уничтожаете модальное окно - вы уничтожаете окно, которое сейчас активно. Поэтому менеджеру окон нужно кому-то передать фокус. Он пытается передать активацию владельцу вашего модального окна, но ведь владелец всё ещё отключён, поэтому менеджер окон пропускает его и ищет кого-то ещё - кого-то, кто ещё не отключён.
Именно поэтому у вас появляется непонятное активное окно.
Правильный порядок действий при уничтожении окна:
- Включить владельца.
- Уничтожить модальное окно.
Примечание переводчика:
(*) Речь идёт о той же схеме, что использует Delphi: вместо использования модальных окон в терминах системы, программист эмулирует модальность, вручную запрещая все прочие окна.
На мой взгляд несколько сбивает с толку слово "владелец". Прочитав оригинал статьи Чена, я понял, что речь идет об окне - владельце (owner) нового окна. И второе, сразу возникает вопрос, а разве модальное открытие окна не делает окно, из которого это новое было открыто, неактивным? Чен в комментарии поясняет, что он описывает случай, когда программист сам явно управляет модальностью, не такой например, как вызов функции MessageBox.
ОтветитьУдалитьСергей О.
>>>об окне - владельце (owner)
ОтветитьУдалитьможно еще больше уточнить: owner window
Да, спасибо за замечание. Поправил.
ОтветитьУдалитьЯ обычно вставляю в скобках оригинал написания, если перевод не слишком удачен и/или может запутать. Конкретно в этом посте я просмотрел. Видимо, в голове пост смешался с предыдущими переводами, и я подумал, что добавил пояснение, а на самом деле - нет.
>>>(*) Речь идёт о той же схеме, что использует Delphi ...
ОтветитьУдалитьСкажите, а можно ли добиться, чтобы в приложении написанном на Delphi, при щелчке на "owner window" (когда открыто модальное окно), происходила такая же реакция, как и "в терминах системы"? (Тоесть помигивали заголовки и т.д.)