Всегда на переднем плане диалогов

Есть ли способ создать немодальное диалоговое окно в C ++ MFC, которое всегда остается поверх других окон в приложении? Я думаю, что это похоже на диалоговое окно «Найти» в Visual Studio 2005 - где оно остается наверху, но вы все равно можете редактировать основной текст.

(Если это имеет значение, это не MDI; это приложение на основе диалогов)


person Smashery    schedule 27.02.2009    source источник


Ответы (2)


Примечание. Это не работает в Windows 10 и может не работать в Windows 7 и 8 (отчеты различаются).

Из ниша:

### Чтобы ваш диалог оставался наверху

Разве вы не видели программы, в которых есть опция «всегда оставаться на высоте»? Что ж, невероятно то, что вы можете сделать свой диалог наверху всего с помощью одной строчки кода. Просто поместите следующую строку в функцию 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);

Чтобы окно располагалось поверх только вашего приложения.

person Adam Davis    schedule 27.02.2009
comment
Это помещает окно поверх абсолютно всего (любого другого приложения) - есть ли способ сделать это так, чтобы окно просто оставалось поверх приложения, частью которого оно является? - person Smashery; 27.02.2009
comment
Нашел: вместо & this- ›wndTopMost я использовал & this-› wndTop - person Smashery; 27.02.2009
comment
Имейте в виду, что может произойти, если два приложения будут создавать самые верхние окна - лучше всего постараться избегать этого, если это вообще возможно - также пользователи могут быть раздражены таким поведением. - person 1800 INFORMATION; 27.02.2009
comment
Поскольку я нашел это в поисках консоли поверх, и в конце концов решение почти такое же, позвольте мне добавить ссылку на готовый к использованию пример: stackoverflow.com/questions/27068650/ - person jave.web; 22.11.2014
comment
Как сказал Санджив в своем ответе, это не удается. У нас есть эта проблема под Windows 10. - person AngelM1981; 28.07.2020

Принятый ответ не подходит для Windows 7 или более поздних версий. (Или, возможно, это я) Но создание немодального диалога как всплывающего окна вместо дочернего решает эту проблему. Теперь он позиционируется относительно главного диалогового окна, но вы можете написать код для ограничения где угодно. Использование без рамки или верхней панели делает его простым окном.

person Sanjeev    schedule 19.07.2018