У меня есть приложение, в котором пользователям при входе в систему предлагается модальное диалоговое окно, в котором они должны выбрать средство, из которого они хотят работать. На этом этапе приложение выглядит так:
Модальное диалоговое окно отображается при вызове этого метода:
bool __fastcall ShowFacChoiceForm()
{
TFacChoiceForm *Form = new TFacChoiceForm( Application );
bool Result = ( Form->ShowModal() == mrOk );
delete Form;
return Result;
}
В этом случае, TFacChoiceForm
наследуется от TForm
Итак ShowFacChoiceForm()
функция вызывает стандарт TForm.ShowModal
метод задокументировано здесь.
Проблема, с которой я сталкиваюсь, заключается в том, что если мое приложение теряет фокус, оно не может снова стать активным окном, если не щелкнуть само модальное диалоговое окно. Чтобы лучше проиллюстрировать это, я представлю следующий сценарий:
Допустим, сегодня пятница, и я решил немного отрешиться и почитать некоторые веб-комиксы. Открыв свое приложение, я открываю другое окно поверх него, например, так:
Затем, откуда ни возьмись, мой босс приходит на анализ производительности, и я пытаюсь переориентировать свое приложение, щелкая где-нибудь в главной форме. Например, в позиции этого красного X на следующем изображении.
На изображении выше я щелкнул мышью в месте красного X. Теперь и форма, содержащая веб-комикс, и мое приложение неактивны. Таким образом, мое приложение не выходит на переднюю часть экрана.
Однако, если я могу щелкнуть где-нибудь в модальном диалоговом окне, например, красный крестик на следующем рисунке …
…тогда мое заявление выходит на передний план, как и следовало ожидать.
Чтобы решить эту проблему, я посмотрел на использование чего-то вроде SetForegroundWindow из Windows API, но я не смог найти способ вызвать событие, так как моя основная форма не запускает события, пока у меня открыто модальное диалоговое окно.
У меня вопрос, как я могу убедиться, что если пользователь щелкнет где-нибудь на моем приложении, оно будет выведено на передний план? Есть ли свойство, которое я могу изменить в моей форме, чтобы сделать это?
Если вы установите для параметра modalresult значение mrcancel в режиме деактивации модального диалогового окна, то при нажатии на него основная форма получит фокус. Затем вы можете проверить, вошел ли пользователь в событие mousedown главной формы, и если нет, снова показать модальное диалоговое окно.
Других решений пока нет …