![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Второе окно всегда сверху, даже когда первое активно. Если у второго окна задавать родителем 0, то в панели задач будут 2 иконки, тоже не катит. Что делать? Как делать правильно? -------------------- |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Абсолютно правильное поведение:
MSDN -> Owned Windows Цитата An owned window is always above its owner in the z-order. |
TarasBer |
![]()
Сообщение
#3
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
А мне что делать, чтобы сверху было активное окно? Первое окно наверх даже BringWindowToTop не вытаскивает, кстати.
-------------------- |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата А мне что делать, чтобы сверху было активное окно? Можно объяснить, что именно тебе нужно? У тебя есть два окна. Какая между ними связь?Если нужно именно два независимых окна, то я бы создал первое, потом - промежуточное, скрытое, и уже к скрытому бы прикрепил потомка - второе окно. Так как окна, которые скрыты (или унаследованы от скрытых) не имеют кнопки на таскбаре - будет то, что нужно. |
TarasBer |
![]()
Сообщение
#5
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Какая между ними связь?
Да никакой, на самом деле. Они равноправны, разница лишь в том, что когда закрывается H1, должно завершаться приложение, ну так это и так в оконной функции указано. Короче, надо выкручиваться. Я поступил по-VCLовски: в качестве главного создал видимое окно нулевого размера, а у тех двух указал родителем его. -------------------- |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата Я поступил по-VCLовски: в качестве главного создал видимое окно нулевого размера, а у тех двух указал родителем его. Это нехорошее решение. Оно сбивает работу на новых ОСях (работа Aero ломается. В частности, live thumbnails, Dynamic Windows, Windows Flip и Windows Flip 3D работают не так, как ожидается. Попробуй например запустить свое приложение под Win7 и минимизировать/максимизировать его. Эффект будет НЕ тот, что при минимизации/максимизации, скажем, NotePad-а. Твое окно будет плавно исчезать/проявляться вместо анимации сворачивания в таскбар).Поэтому, чтобы заставить программу, компилируемую Дельфями ниже 2007, работать нормально под Вистой/Семеркой, нужно вносить некоторые изменения в код. Об этом есть статья на Королевстве Дельфи, если не ошибаюсь, Д. Ларионов написал. А ты в свой проект намеренно включаешь этот глюк от VCL. |
TarasBer |
![]()
Сообщение
#7
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
А, вот оно как.
Тогда сделаю во-твоему. Вот они, преимущества безVCLного кода... Захотел - юникодом все компоненты задал, захотел - окна как надо сделал. Ещё оффтоп, но тоже об окнах - у меня в одной программе главное окно без рамки (ws_Popup), она страшно глючит при запуске под линуксом через WINE, это известный глюк WINE или в программе что-то не так? -------------------- |
TarasBer |
![]()
Сообщение
#8
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Теперь у меня новая проблема.
Если переключиться на другое приложение, закрывающее окно2, а потом снова на это, то окно2 пропадает. Надо ловить wm_Activate и руками что-то писать? И ещё, надо, чтобы при соваривании окна1 сворачивалось и окно2 (да, я забыл это сказать, думал, что такой эффект сам собой получится).
-------------------- |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата Теперь у меня новая проблема. Вот теперь - "вот тебе и преимущества безVCL-ного кода". Само сделается? Не сделается. Надо вручную прописывать. Ловишь WM_SYSCOMMAND, и если WPARAM = SC_MINIMIZE, то сворачиваешь главное окно и скрываешь (повторяю, скрываешь а не сворачиваешь, если свернешь - оно свернется аккуратно над таскбаром, слева, я не думаю, что это зрелище кого-нибудь обрадует, тебя - в первую очередь) второе. Как только получаешь SC_RESTORE - показываешь второе окно и разворачиваешь первое.Если переключиться на другое приложение, закрывающее окно2, а потом снова на это, то окно2 пропадает. Надо ловить wm_Activate и руками что-то писать? И ещё, надо, чтобы при соваривании окна1 сворачивалось и окно2 (да, я забыл это сказать, думал, что такой эффект сам собой получится). То же самое касается и обработки WM_ACTIVATE... Проверить какая именно активация была, если по какому-то окну щелкнули мышой (WA_CLICKACTIVE), то делать BringWindowToTop(другое_окно), потом BringWindowToTop(то_по_которому_щелкнули). Чтобы окна расположились в правильном порядке. Если ткнули на кнопку в таскбаре (это уже случай WA_ACTIVE, если не произошло WA_CLICKACTIVE перед этим), то поднимать окна в порядке "сначала H2, потом H1", ибо кнопка в таскбаре связана с H1, значит, оно должно оказаться выше. Если хочется особо поизвращаться - заведи булеву переменную IsFirstWindowAbove, и поднимай окна в нужном порядке, при активации к тому же меняя значение этой переменной. Ну, как тебе безVCL-ный код? |
TarasBer |
![]()
Сообщение
#10
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> это уже случай WA_ACTIVE, если не произошло WA_CLICKACTIVE перед этим
Не, так не прокатило - при старте как раз происходит wa_Active без wa_ClickActive и если в обработчике "wa_Active, перед которым не было wa_ClickActive" написать подъём окон, то при старте они дёргаются. > Ну, как тебе безVCL-ный код? Документацию рыть много надо, а так разницы мало - у меня всё равно болшая часть кода не относится к интерфейсу. Добавлено через 1 мин. Или я не так понял? Оконна функция:
-------------------- |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Это я что-то ступил... Есть же еще WM_ACTIVATEAPP. Вот его и надо ловить, когда переключаемся с другого приложения.
varКак-то так. |
TarasBer |
![]()
Сообщение
#12
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Обнаружил, что если WM_ACTIVATEAPP написать наоборот, то есть
То всё равно после переключения сверху оказывается первое окно. То есть какое-то событие после этого ещё делает окно H1 сверху. А я, допустим, хочу, чтобы после переключения именно второе окно сверху было. (Да, я решил поизвращаться, чтобы после активации сверху было то окно, которое было сверху до деактивации). -------------------- |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата А я, допустим, хочу, чтобы после переключения именно второе окно сверху было. Автоматически этого не будет. Потому что кнопка в таскбаре связана с первым окном, у него приоритет, после клика по кнопке активируется именно то окно, которое с этой кнопкой связано. Тебе надо это поведение как-то отменить. Как - пока не придумалось. |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Так. Ну, допустим, в WM_ACTIVATEAPP проверять, если это не самая первая активация (то есть, не та, которая при создании приложения, а та, которая уже при клике на таскбаре, там разрулишь флагами) - то просто посылать
PostMessage(H1, WM_ACTIVATE, WA_CLICKACTIVE, H1); // если надо активным сделать окно №1 , и пусть обработчик WM_ACTIVATE делает свою работу... |
TarasBer |
![]()
Сообщение
#15
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Заработал такой вариант оконной функции:
Осталась одна проблема - если оставить активным первое окно, а потом переключиться на другое приложение и обратно, то заметно небольшое передёргивание - ведь сначала второе окно вытягивают наверх, а потом сразу первое. Нельзя ли сразу как-нибудь вывести второе окно именно на 2 место? -------------------- |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Вот этого никогда не делал, хотя теоретически знаю, что в этом может помочь функция SetWindowPos (в данном конкретном случае особенно интересен второй параметр hWndInsertAfter, который указывает, после какого окна в Z-последовательности будет установлено hWnd).
К сожалению, я сейчас не под Windows, так что проверить возможности не имею. |
TarasBer |
![]()
Сообщение
#17
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Заменил на
Теперь всё ништяк. -------------------- |
![]() ![]() |
![]() |
Текстовая версия | 10.07.2025 17:09 |