Всегда впереди диалогов
Есть ли способ создать немодальное диалоговое окно в C++ MFC, которое всегда остается поверх других окон в приложении? Я думаю, что-то вроде диалогового окна "Найти" в Visual Studio 2005 - там, где оно находится сверху, но вы все равно можете редактировать основной текст.
(Если это имеет какое-то значение, это не MDI; это приложение на основе диалога)
3 ответа
Из Ниша:
Заставить ваш диалог оставаться на вершине
Разве вы не видели программы, в которых есть опция "всегда оставаться на вершине"? Что ж, невероятно то, что вы можете сделать так, чтобы ваш диалог оставался на вершине всего одной строкой кода. Просто поместите следующую строку в функцию OnInitDialog() вашего диалогового класса.
SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
По сути, мы используем функцию SetWindowPos для изменения Z-порядка нашего диалогового окна. Мы заставляем наш диалог оставаться поверх всех остальных окон, перемещая его в верхнюю часть Z-порядка. Теперь даже когда вы активируете какое-то другое окно, наше окно останется сверху. Но я бы посоветовал вам убедиться, что вы точно знаете, что делаете, когда делаете это, потому что это может раздражать людей, если они не могут убрать ваше окно с дороги, когда они этого хотят.
Как вы упомянули в комментариях, приведенная выше строка заставляет окно располагаться поверх каждого приложения. Вам нужно будет сделать
SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
Чтобы окно сидело поверх только вашего приложения.
-Адам
Принятый ответ не для Windows 7 или выше. (Или, может быть, это я) Но решение проблемы делает создание немодального диалога всплывающим, а не дочерним. Теперь он позиционируется в главном диалоговом окне, но вы можете написать код для ограничения в любом месте. Использование без рамки или верхней панели делает это окно простым.
У меня это сработало в Microsoft Windows версии 10.0.18362.476. Пришлось поставить SetWindowPos(&this->wndTopMost, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); в OnInitDialog и сделайте диалог как PopUp.