Страница 1 из 1

Альтернатива для BorderStyle=bsNone + WindowState=wsMaximize

СообщениеДобавлено: 28.06.2021 21:05:30
VirtUX
Если у TForm установлено BorderStyle := bsNone, то попытка сделать WindowState := wsMaximized проигнорируется классом.
В 2009 году вроде как это исправили для версии Lazarus 0.9.29.
Но у меня почему-то не работает.
OS: KDE Neon
Среда разработки собрана под QT5

Может этот баг проявляется только под QT5? Может кто-нибудь проверить у себя под другими виджетсетами?
И если это баг, то можно-ли как-то решить проблему альтернативно? Например:
Код: Выделить всё
Form.BoundsRect:= Form.Monitor.WorkareaRect;

мог бы помочь, если бы окно не расползалось по всему монитору, и тем самым прячась частично под панелями. Может тут можно еще как-то определить координаты панелей и вычесть их из TRect?
И, в принципе, что происходит во время WindowState := wsMaximized, когда BorderStyle <> bsNone? Как оно работает?

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 02:48:19
Vadim
Я на винде делал такое - форма должна была полностью закрывать рабочий стол и убираться после прикладывания rfid-карты к датчику. Lazarus 2.0.10. BorderStyle = bsNone. В Linux Lazarus был собран под KDE (чтобы при новой установке не волочь кучу зависимостей) и тоже прекрасно работало.

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 11:52:04
VirtUX
Vadim писал(а):полностью закрывать рабочий стол

не проблема:
Код: Выделить всё
WindowState:= wsFullScreen

Мне нужно повторить работу кнопки "развернуть на весь экран". То есть панели не должны перекрываться окном или перекрывать окно.

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 12:55:54
wavebvg
Для GTK2 дёрните так:

Код: Выделить всё
 
  Gtk2Proc.SetWindowFullScreen(Self, True);


Self -- это форма.

В трекере баг есть, но всем всё равно.

Скрыть декорации:

Код: Выделить всё
var
  VWindow: PGtkWindow;   
begin   
  VWindow := {%H-}PGtkWindow(Self.Handle);   
  gtk2.gtk_window_set_resizable(VWindow, False);
  gtk2.gtk_window_set_decorated(VWindow, False);
  gtk2.gtk_widget_set_size_request(PGtkWidget(VWindow), Width, Height);
end;


"Стандартный" способ не использовать.

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 17:39:53
VirtUX
Заметил, что этот баг наблюдается если подключено более одного монитора. При одном мониторе - поведение, как и ожидается.
Если максимизировать на главном мониторе, то окно смещается на ширину панели за границу монитора. Если максимизировать на дополнительном мониторе, окно прячется под саму панель.
То есть получается, что нужно вычислить ширину и расположение панели, и тогда можно будет развернуть окно, как нужно.
Вопрос: как можно вычислить ширину и расположение панели на рабочем столе?

Добавлено спустя 1 минуту 42 секунды:
Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaximize
Тут еще надо учесть, что панелей может быть более одной. А еще интересно как на MacOS оно будет?...

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 18:36:43
wavebvg
В принципе, можете посмотреть тут, как у меня получилось это сделать на поделке (делал себе временно как рабочий инструмент)

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 29.06.2021 19:05:13
VirtUX
Нужно кроссплатформенное решение без привязки к GTK, Qt, WIN32 или еще к чему.

Re: Альтернатива для BorderStyle=bsNone + WindowState=wsMaxi

СообщениеДобавлено: 30.06.2021 14:19:40
wavebvg
VirtUX писал(а):Нужно кроссплатформенное решение без привязки к GTK, Qt, WIN32 или еще к чему.

Ну тут будет много проблем. Под Win32 и Gtk2 просто работать не будет (но можно заставить). Под Qt нужно спросить у постояльцев.