Hroudtwolf hat geschrieben:Ich suche dringend nach einer guten Möglichkeit(Code) für ein
Windowing im DX-Fullscreen(OpenScreen).
Also quasi Fenster darstellen.
Ich hatte sowas mal getestet, einen
ScreenManager für PB-Screens.
War wie gesagt nur ein Test, aber schau es Dir trotzdem mal an -
um vielleicht eine Idee zu bekommen.
Das System beim selber zeichnen ist recht einfach:
Du brauchst Sprites, die Mausfunktionen, und evtl. noch die
Tastatur (für Shortcuts).
In meinem Beispielcode siehst Du folgende Funktionen:
InitScreenManager()
Interne Initialisierung + InitSprite, InitMouse, InitKeyboard
smOpenWindow()
Erstellt ein Fenster. Dazu wird einfach ein Sprite erstellt und
ein Fenster darauf gezeichnet, je nachdem ob mit oder ohne
Titlebar, mit oder ohne Border usw.
Intern wird das erstellte Fenster/Sprite an eine LinkedList
angehangen.
smHideWindow()
Versteckt ein Fenster. Dazu wird in der LinkedList nur ein
Flag gesetzt, so daß dieses Fenster nicht mit dargestellt wird.
Außerdem wird gecheckt welches Fenster nun das aktuelle
ist, und entsprechend neu gezeichnet.
RunScreenManager()
Das ist die Hauptfunktion die alles managt. Diese Funktion
macht folgendes:
1. Internen MouseManager aufrufen
2. Alle Fenster darstellen, d.h. einfach die LinkedList durchgehen und alle Sprites anzeigen
3. MouseCursor-Sprite darstellen
Der MouseManager hat hier die meiste Arbeit:
ExamineMouse() aufrufen.
MouseX() und MouseY() aufrufen und Punkte speichern.
MouseButton(1), MouseButton(2) und MouseWheel() aufrufen
und Zustand speichern.
Danach wird eine Funktion sub_smFindWindowByMouseXY()
aufgerufen, die in der LinkedList (von hinten angefangen, also
vom obersten Fenster aus) das Fenster sucht, welches sich
unter MouseX/Y befindet.
Wenn Du dieses Fenster hast, dann checkst Du weiter was
zu tun ist: Wenn MouseButton(1) gedrückt, schaust Du ob
er neu gedrückt wurde, oder schon vorher gerückt war.
Wenn neu gedrückt: Message an Fenster, wenn innerhalb
der ClientArea - ansonsten Statusflag für TitlebarMove oder
per Border resizen setzen. Dazu das letzte aktivierte Fenster
deaktivieren (d.h. neu zeichnen mit Style Titlebar disabled),
das neue aktivierte Fenster neu zeichnen mit aktiver Titlebar
und in der LinkedList ans Ende setzen (also OnTop bringen).
Dazu kommen noch Checks ob der Cursor sich direkt auf
der ClientArea des Fensters befindet, oder z.B. am Rand
(wenn das Fenster einen Border hat). Je nachdem welche
Situation zutrifft, setzt Du ein entsprechendes Sprite für
den MouseCursor.
Das System ist also im Prinzip recht simpel - ist halt nur
ein WindowManager.
Die Fenster laufen damit. Gadgets kannst Du auch recht
einfach hinzufügen - das sind wieder nur Sprites auf die
Du zeichnest.
Jedes Fenster hat dann noch eine Sub-LinkedList, in der die
Gadgets eingetragen sind. Wenn ein Mausklick in der ClientArea
des Fensters war, dann suchst Du danach einfach welches
Gadget es war, und sendest an dieses eine Message oder
rufst eine Funktion OnClick für das Gadget auf.
Ein Button hätte z.B. den Status 1, wo er normal gezeichnet
wird, und den Status 2, wo er bei gedrückter Maustaste als
gedrückt gezeichnet wird.
Im Prinzip nur Fleißarbeit sowas zu machen - und in ein paar
Tagen kann man da schon ein nettes kleines System zusammenbasteln.
Vielleicht hilft es Dir als kleine Anregung. Viel Spaß!
