Tło nie musi mieć wcale "stay on top", wystarczy że nie ma ramki (jest WS_POPUP) i zajmuje dokładnie cały ekran (w przypadku systemu jednomonitorowego jest to okno na pozycji 0,0 i o rozmiarze takim jak rozdzielczość; [...]
Tło aplikacji to jedno z wielu założeń interfejsu i jest to jak najbardziej celowe;
Krótko wyjaśniając - formularz tła ma przykrywać calutki ekran, łącznie z paskiem zadań, a dodatkowo stać zawsze na wierzchu, stąd fsSystemStayOnTop
; Oczywiście opcja minimalizacji programu jest dostępna; Druga rzecz - rozmiar głównego formularza dostosowywany jest po pierwsze względem rozdzielczości ekranu, a po drugie - wyrównywany do kontentu głównego formularza (głównie do gridów); Do tego formularz tła ma ledwo widoczny "znak wodny" (prosty i ładny efekt), ułożony kafelkowo (dwa rodzaje kafli, aby wzór układał się po ukosie) i bez względu na rozdzielczość ekranu, widoczne będzie obrzeże tła; A z racji tej, że główny formularz programu będzie mieć format zbliżony do 4:3
to im bardziej panoramiczny ekran, tym więcej tła po bokach będzie widoczne;
[...] jeśli chcemy obsługiwać wiele monitorów to są funkcje winapi zwracające odpowiednie współrzędne).
Do tego celu jest obiekt Screen
i jego właściwość Monitors
, więc nie trzeba bawić się ręcznie z WinAPI;
Pozostałe formy mogą mieć jako parenta formę z tłem i też stay on top nie jest potrzebne.
To nie takie proste, bo jeśli formularz tła ma styl fsSystemStayOnTop
, to kolejne muszą mieć albo taką samą wartość, albo przynajmniej fsStayOnTop
; Trochę pomęczyłem się z ustawianiem tych formularzy i niektóre z kłopotów to np. przykrywanie głównej formy przez okno tła po przywróceniu zminimalizowanego programu, miganie paska zadań, problem z obsługą na innym ekranie niż domyślny itp.; Teraz mam wszystko już dopracowane i wszystkie formularze wyświetlają się na dowolnym ekranie, mają poprawne rozmiary i położenie, a także poprawnie zachowują się przy deaktywacji i minimalizacji aplikacji;
Jest wiele "na internetach" błędnych przykładów jak zrobić pełnoekranowe okno pod Windowsem, gdy tymczasem pod Windows w zasadzie nie ma czegoś takiego: program pełnoekranowy to po prostu taki, który zajmuje pełen ekran.
Owszem, dlatego też rozmiar i położenie formularza tła ustawiam ręcznie w konstruktorze, a jedyne co wyklikałem w oknie IO do tego celu to FormStyle
; Zresztą minimalizstyczny kod ustawiający położenie i rozmiar formularza tła (który jako jedyny ma być zawsze na pełny ekran) wygląda tak:
BackgroundForm.BoundsRect := InterfaceManager.WorkingMonitor.BoundsRect;
Określenie wartości właściwości WorkingMonitor
w obiekcie InterfaceManager
(własnej klasy) to dokładnie jeden warunek, podany w tym poście, tyle że dla klasy TMonitor
:
if IsDebuggerPresent() then
FWorkingMonitor := Screen.Monitors[Screen.MonitorCount - 1]
else
FWorkingMonitor := Screen.Monitors[0];
Póki co przerzucanie okien programu z matrycy laptopa na monitor ma jedynie pomóc w ewentualnym debugowaniu; W przyszłości docelowy ekran będzie można wybrać samemu, więc powyższy warunek będzie nieco bardziej rozbudowany i uwzględniać będzie dane z systemu konfiguracji (czyli ta część po Else);
Ale to tak nawiasem mówiąc, bo z formularzami i trybem pełnoekranowym nie mam żadnego problemu - wątek dotyczy jedynie rozpoznania czy aplikacja jest debugowana czy nie.