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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

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

Сообщение 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? Как оно работает?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Я на винде делал такое - форма должна была полностью закрывать рабочий стол и убираться после прикладывания rfid-карты к датчику. Lazarus 2.0.10. BorderStyle = bsNone. В Linux Lazarus был собран под KDE (чтобы при новой установке не волочь кучу зависимостей) и тоже прекрасно работало.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Vadim писал(а):полностью закрывать рабочий стол

не проблема:

Код: Выделить всё

WindowState:= wsFullScreen

Мне нужно повторить работу кнопки "развернуть на весь экран". То есть панели не должны перекрываться окном или перекрывать окно.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение 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;


"Стандартный" способ не использовать.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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

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

Сообщение wavebvg »

В принципе, можете посмотреть тут, как у меня получилось это сделать на поделке (делал себе временно как рабочий инструмент)
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Нужно кроссплатформенное решение без привязки к GTK, Qt, WIN32 или еще к чему.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

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

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