Модальное окно
|
|
salexeiy | Дата: Четверг, 26.09.2019, 15:55 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Каким образом можно создать модальное окно средствами Window9, к примеру окно "О программе"? Т.е. алгоритм такой: создаётся главное окно программы с виджетами, при нажатии на кнопку появляется окно "О программе" со своими виджетами, при закрытии оно исчезает и фокус передаётся в главное окно.
|
|
| |
haav | Дата: Четверг, 26.09.2019, 17:45 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Создаешь обычные окна и управляешь ими при помощи: DisableWindow. Когда надо показываешь окно (диалог) "О программе" и делаешь неактивным основное окно. При закрытии диалога , снова делаешь активным основное окно.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
salexeiy | Дата: Пятница, 27.09.2019, 13:32 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 72
Статус: Offline
| Сделал, спасибо! Но теперь, при закрытии окна "О программе", основное окно улетает под другие окна, если открыто несколько приложений, к примеру проводник или браузер. Можно как то оставить окно на месте?
|
|
| |
haav | Дата: Пятница, 27.09.2019, 17:33 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Под Windows:
SetForegroundWindow (hwnd)
И если будут проблемы с фокусом, то еще SetFocus(hwnd)
--------------------
Под Linux все может оказаться не очевидным, поскольку все зависит от менеджера окон... В любом случае можно попробовать функции:
gtk_window_present (hwnd) или gtk_widget_grab_focus(hwnd)
Или грязный хак вроде:
SetWindowTop(hwnd , 1) установит окно поверх всех окон , таким образом вытащит окно наверх, а далее запуск процедуры по таймеру скажем через 200 мс и там обратная операция SetWindowTop(hwnd , 0)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Пятница, 04.10.2019, 20:44 | Сообщение # 5 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Цитата salexeiy ( ) основное окно улетает под другие окна, если открыто несколько приложений, к примеру проводник или браузер. Можно как то оставить окно на месте?
Была подобная проблема. Универсального решения нет. Под XP скорее всего будет нормально работать SetForegroundWindow (hwnd). Под семёркой и более новыми виндами уже придётся мудрить. Рекомендую попробовать разные варианты, например включать поверх всех окон https://docs.microsoft.com/en-us....owtotop после чего эмулировать клик мышкой по центру заголовка окна. Само собой нужно получать координаты и габариты окна через WinAPI, иначе мышка может ткнуть не туда, куда надо. И не забывать возвращать курсор в первоначальное положение.
Добавлено (04.10.2019, 21:09) --------------------------------------------- Вот что-то смог у себя найти, пробуйте, без вышеописанного, но должно работать:
Код ' ' Установка фокуса на окна '
SUB SetOutFocus (FocusTo AS HWND, FocusFrom AS HWND) IF GetForegroundWindow() <> FocusTo THEN SetForegroundWindow (FocusTo) IF GetTopWindow(0) <> FocusTo THEN BringWindowToTop (FocusTo) IF GetFocus() <> FocusTo THEN PostMessage (FocusFrom, WM_KILLFOCUS, FocusTo, 0) SetFocus (FocusTo) PostMessage (FocusFrom, WM_SETFOCUS, FocusFrom, 0) PostMessage (FocusTo, WM_ACTIVATE, WA_CLICKACTIVE, FocusFrom) END IF ShowWindow (FocusTo, SW_SHOW OR SW_SHOWNORMAL) END SUB
В моём случае, вроде бы всегда срабатывало.
Сообщение отредактировал DarkDemon - Пятница, 04.10.2019, 21:11 |
|
| |