|
Вопрос # 1 879/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Каким образом сделать чтобы форма отображалась поверх всех окон?
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 6 сентября 2008, 15:47
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: ANBsoft
Здравствуйте, IlluminatI!
Свойство формы FormStyle в fsStayOnTop
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 6 сентября 2008, 15:59
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 7 сентября 2008, 00:00; участников в обсуждении: 4.
|
Вадим К (статус: Академик), 6 сентября 2008, 16:47 [#1]:
возникает законный вопрос, а зачем? FormStyle в fsStayOnTop делает форму поверх остальных только для этого приложения.
А сделать форму поверх всех других - нельзя. Нельзя по одной простой и глупой причине. Приставьте себе, что появилось две такие формы (привильней всё таки говорить "окна приложения"). И обе хотят быть сверху, что же делать?
Но некоторые горе программисты решают эту задачу так. Они по таймеру проверяют, что их окно находиться под другим и с помощью BringWindowToFront подымают своё окно. Но где то в районе Win95-Win98 Майкрософт прикрыла эту возможность - теперь эта функция делает окно поверх других только в том случае, если приложение активно. А если оно свёрнуто/в фоне, то просто начинает мигать кнопктой на панели задач.
Это всё было сделано не случайно, а преднамерено - в то время практически каждая программа старалась вибросить своё окно на передний план. если было 3-4 таких программы, зрелище было незабываемое. Работать было нельзя.
Также не работают разные методики, которые вначале делают приложение активным, а потом выводят окно. Всё это присекается.
Но саму функцию, которая выводит окно на передний план, забывая о всех ограничениях, они сделали. Но эта функция не делает окно "всегда сверху".
По этому, учитывая всё вышесказанное, считаю, что окно, которое всегда стремиться вылезти на передний план - плохая затея, за исключением некоторых случаев, которые можно пересчитать по пальцам.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Amidamaru (статус: 4-ый класс), 6 сентября 2008, 17:38 [#2]:
Я неслогласен. FormStyle в fsStayOnTop делает форму поверх остальных окон для всех приложений. Очень простой пример - "Диспечер задач", у которого стоит галочка Параметры - Поверх остальных окон.
Если интересно, что случится если таких форм будет несколько - запустить несколько Диспечеров задач непроблема.
Все окна распологаются в некоторой последовательности (Z-последовательнось), просто StayOnTop-окна имеют отдельную.
|
|
Вадим К (статус: Академик), 6 сентября 2008, 17:54 [#3]:
В Вин98 и раньше оно то может так и работало. Но в ХР - нет.
А диспетчер задач на то и диспетчер, что ему положенно так работать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Amidamaru (статус: 4-ый класс), 6 сентября 2008, 19:02 [#4]:
Если создать проект с формой FormStyle = fsStayOnTop и запустить несколько копий - результат будет тотже.
StayOnTop это не просто понятие делфи, например в функциях CreateWindow и SetWindowPos можно установить аттрибут окна (WS_EX_TOPMOST или HWND_TOPMOST) который и делает окно "поверх всех остальных". А Win98 здесь вообще непричом.
Цитата из хелпа к CreateWindow:
WS_EX_TOPMOST
Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. (Про Win98 Only ничего)
Цитата из хелпа к SetWindowPos:
HWND_TOPMOST
Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated. (Также про Win98 Only ни слова)
|
|
Вадим К (статус: Академик), 6 сентября 2008, 22:49 [#5]:
Я немного запутался сам и Вас запутал, и мы отошли от темы. Человек хотел "поверх всех окон". Вот это уже не реально.
Я понял почему я запутался. Я в свое время мучился с поднятием окна на передний план. А когда приложение свёрнуто, то это не всегда возмножно. А начальство требовало.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 6 сентября 2008, 23:03 [#6]:
Интересный вопрос был Спасибо всем, пойду пробовать!
|
|
Amidamaru (статус: 4-ый класс), 6 сентября 2008, 23:24 [#7]:
(: В моём понимании "поверх всех окон" это абстрактное понятие. Конечно же не всегда оно будет поверх абсолютно всех окон, а только тогда когда оно активно, иначе "выше" него будет как минимум Меню Пуск 
А поднятие окна на передний план я делал через SetForegroundWindow (по примеру из книги), нащёт свёрнутости непомню, но помоему не мешало
|
|
ANBsoft (статус: Студент), 7 сентября 2008, 00:00 [#8]:
fsStayOnTop выводит окно поверх всех обычных окон, и поверх всех вообще в том случае если окно активно (оно будет даже поверх диспечера задач), если будет активно другое окно со свойством fsStayOnTop, то оно будет поверх этого окна.
Ничего сложного нет ни в реализации, ни в использовании. Когда-то давно писал свой планировщик (напоминалка что/когда делать), так при срабатывании события проверял нужно ли развернуть окно (если оно свернуто) и переключал FormStyle в fsStayOnTop, все нужное окно оказывалось поверх других. И я не замечал чтобы "практически каждая программа старалась вибросить своё окно на передний план" - для обычных задач в этом нет смысла.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|