FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 03:48Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Модальное окно
Модальное окно
salexeiyДата: Четверг, 26.09.2019, 15:55 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: Offline
Каким образом можно создать модальное окно средствами Window9, к примеру окно "О программе"? Т.е. алгоритм такой: создаётся главное окно программы с виджетами, при нажатии на кнопку появляется окно "О программе" со своими виджетами, при закрытии оно исчезает и фокус передаётся в главное окно.
 
haavДата: Четверг, 26.09.2019, 17:45 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Создаешь обычные окна и управляешь ими при помощи: DisableWindow. Когда надо показываешь окно (диалог) "О программе" и  делаешь неактивным основное окно. При закрытии диалога ,  снова делаешь активным основное окно.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
salexeiyДата: Пятница, 27.09.2019, 13:32 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: Offline
Сделал, спасибо! Но теперь, при закрытии окна "О программе", основное окно улетает под другие окна, если открыто несколько приложений, к примеру проводник или браузер. Можно как то оставить окно на месте?
 
haavДата: Пятница, 27.09.2019, 17:33 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Полковник
Группа: Друзья
Сообщений: 188
Репутация: -2
Статус: 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
 
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Модальное окно
  • Страница 1 из 1
  • 1
Поиск: