lbgui.h

Diese Include-Datei bietet Funktionen für die Erstellung von Standard-GUI-Elementen wie Buttons, Windows, Checkboxen, InfoBoxen, Listboxen, Progress Bars, Slider, Scrollbars, Rechtsklick-Menüs, Comboboxen und Editboxes. Alle GUI-Elemente sind aus Panel- und Text-Objekten aufgebaut. Es ist auch möglich, Panels und Text-Objekte auf GUI-Fenster zu setzen. Der Stil und die Bilder sind vollständig anpassbar.

lbgui.h wurde von Lukas Brozio für den Sommer-2010-Wettbewerb geschrieben. Es ist nicht direkt in Gamestudio enthalten, sondern kommt mit dem goodies8.zip Add-On-Paket, das kostenlos zum Download auf der Gamestudio Download-Seite bereitsteht. Öffnen Sie einfach das Paket und kopieren Sie lbgui.h in den Gamestudio include Ordner. Das Paket enthält auch den "grünen" Default-Stil wie im Bild oben, und zwei selbsterklärende Demos - smalldemo.c und demo.c. Das LBGUI Handbuch ist ebenfalls im Paket enthalten. Alle GUI-Funktionen sind im Handbuch ausführlich beschrieben, im Folgenden finden Sie nur eine kurze Übersicht.

Verwendung

Am Beginn Ihres Main-Skripts includen Sie nach acknex.h die Datei lbgui.h, z.B.:
#include <acknex.h>
#include <default.c>
#include <lbgui.h>
Stellen Sie sicher, dass die lbgui.h sich im include Ordner befindet. Bevor Sie LBGUI Funktionen nutzen können, öffnen Sie die Bibliothek per LBGUI_open() in Ihrer main Funktion:
function main()
{
  ...
  LBGUI_open();
Dadurch wird die Schleife gestartet, die alle GUI Elemente steuert, und eine weitere Schleife zur Eingabe in Editboxen. Wenn Sie LBGUI nicht mehr benötigen, schließen Sie die Bibliothek per LBGUI_close():
LBGUI_close();
Dies löscht alle GUI Elemente und beendet die Schleifen. Zum automatischen Schliessen am Programmende benutzen Sie einfach folgende Zeile:
on_exit = LBGUI_close; // Close LBGUI when the project is closed

Structs

Alle LBGUI Elemente sind in Structs gespeichert, genau wie die Engine-Objekte. Die Namen aller Structs und Funktionen in LBGUI beginnen mit "LBG_" (z.B. LBG_BUTTON).

Alle LBGUI Structs beginnen wie folgt:

typedef struct LBG_STRUCTNAME // the name of the GUI element
{
	long ssize; // Size of the struct
	long stype; // Type of GUI element	
	struct LBG_STRUCTNAME* next; // Next object in the linked list
	struct LBG_STRUCTNAME* previous; // Previous object in the linked list
...

stype enthält eine Nummer (1-18) mit folgender Bedeutung:
1 - Window
2 - Button
3 - Panel
4 - Text
6 - Checkbox
7 - Infobox
8 - Progress-Bar
9 - Horizontaler Scrollbar
10 - Vertikaler Scrollbar
11 - Slider
13 - Listbox
14 - Listenelement
15 - Rechtsklick Menü
16 - Combobox
17 - Digits
18 - Editbox

Wegen der Ähnlichkeit der Structs können die gleichen Funktionen mit mehreren oder allen GUI-Elementen funktionieren. LBGUI Funktionen, die das tun, verwenden immer LBG_WINDOW als Dummy-Struktur. Wenn Sie eine Funktion für mehr als ein bestimmtes GUI-Element schreiben wollen, können Sie in lbgui.h schauen, ob sie kompatibel sind. Beachten Sie, dass die Reihenfolge, in der Struct-Parameter im LBGUI Handbuch dokumentiert sind, von der Reihenfolge in der Struct-Definition abweichen können. Einige Parameter sind überhaupt nicht dokumentiert, weil sie nur zur internen Verwendung dienen.

Alle Structs sind in einer verketteten Liste enthalten. Dies sind die ersten Instanzen der einzelnen Structs:

LBG_WINDOW* LBG_WINDOW_FIRST = 0;
LBG_BUTTON* LBG_BUTTON_FIRST = 0;
LBG_PANEL* LBG_PANEL_FIRST = 0;
LBG_TEXT* LBG_TEXT_FIRST = 0;
LBG_CHECKBOX* LBG_CHECKBOX_FIRST = 0;
LBG_INFOBOX* LBG_INFOBOX_FIRST = 0;
LBG_PROGRESSBAR* LBG_PROGRESSBAR_FIRST = 0;
LBG_HSCROLLBAR* LBG_HSCROLLBAR_FIRST = 0;
LBG_VSCROLLBAR* LBG_VSCROLLBAR_FIRST = 0;
LBG_SLIDER* LBG_SLIDER_FIRST = 0;
LBG_LISTBOX* LBG_LISTBOX_FIRST = 0;
LBG_RIGHTCLICK* LBG_RIGHTCLICK_FIRST = 0;
LBG_COMBOBOX* LBG_COMBOBOX_FIRST = 0;
LBG_DIGITS* LBG_DIGITS_FIRST = 0;
LBG_EDITBOX* LBG_EDITBOX_FIRST = 0;
Auf das nächste und vorherige Objekt einer solchen Liste kann mit Object->next und Object-> previous zugegriffen werden.

Es gibt auch andere Structs, die keine GUI-Elemente, sondern Bitmaps für GUI-Elemente enthalten.

Flags

Alle GUI-Elemente haben Flags, gespeichert in ihrem flags Parameter. Alle Flag-Namen beginnen mit XF_, wobei X die aus ein oder zwei Buchstaben bestehende Abkürzung für die GUI-Elemente ist. Genau wie "normale" Flags können Sie sie setzen, zurücksetzen oder wechseln, entweder mit Bit-Operatoren (|,&,~,^), oder mit den set(obj, flag) etc. Makros.

Die GUI selbst hat auch Flags, die in der globalen long LBG_flags gespeichert werden. Die folgenden Flags stehen zur Verfügung:

LBGUI_RUNNING - Die GUI ist aktiv, Schleifen laufen.
LBGUI_DISABLED - Die GUI ist abgeschaltet.
LBGUI_PROTECTMOUSE - Befindet sich die Maus außerhalb des Engine-Fensters, verhält sich die GUI als wäre die Maus am Fensterrand. Dies verhindert, dass GUI-Fenster aus dem Engine-Fenster herausgeschoben werden und dort verloren gehen können.
LBGUI_STOPACTION - Stoppt eine Aktion, die in der Regel nach bestimmten Ereignissen ausgeführt wird. Dieses Flag wird von LBG_stop_action aktiviert.

Einige Flags sind für den internen Gebrauch und nicht im Handbuch dokumentiert.

Layers

Alle GUI-Elemente haben Layer. Sie sind nicht genau das gleiche wie die Layer von Panels, Texten oder Views. Die Layer der Panels / Texte der GUI-Elemente werden durch ihren layer-Wert bestimmt. Window-Elemente haben einen individuellen Layer, der automatisch gesetzt ist. Sie sollten keine Veränderungen des layer-Werts eines Window-Elements direkt vornehmen, sondern hierzu die vorgesehenen GUI-Funktionen verwenden.

Die Layer der Panels / Texte aller untergeordneten Elemente eines Fensters werden durch den Layer der Eltern-Fenster und ihren eigenen layer-Wert berechnet. Der layer-Wert kann in der Regel auf der Defaulteinstellung belassen werden. Es ist nur notwendig, layer zu ändern, wenn Elemente sich überlappen. Beachten Sie, dass GUI-Elemente nicht "erkennen", ob sich andere GUI-Elemente über ihnen befinden. Wenn Sie z. B. zwei sich überlappende Schaltflächen wirklich brauchen, können Sie über button->Condition verhindern, dass beide zur gleichen Zeit reagieren.

Die Layers der Panels / Texte der GUI-Elemente hängen von den Werten ab, die in lbgui.h definiert sind:


Name: Default  Beschreibung:
LBG_lowest_layer
10
Niedrigster Layer, für Hintergrund-Elemente.
LBG_highest_layer
1000
Voraussichtlich höchster Layer, verwendet z.B. von Infoboxen. GUI-Elemente können während des Programmlaufs einen höheren Layer-Wert bekommen!
LBG_winlayer
10
Niedrigster Layer für Window-Elemente relativ zu LBG_lowest_layer.
LBG_layer_step
10
Layer-Unterschied zwischen zwei Window-Elementen.
LBG_butlayer_step
2
Layer-Unterschied zwischen Panel-/Text-Objekten eines GUI-Elements.

Um diese Defines für Ihr Projekt zu ändern, definieren Sie sie neu vor dem Includen der lbgui.h.

Fonts

GUI-Elemente, die Text enthalten, verwenden defaultmäßig folgende Fonts:
FONT* LBG_window_font = "Arial#24b";
FONT* LBG_button_font = "Arial#24b";
FONT* LBG_checkbox_font = "Arial#24b";
FONT* LBG_infobox_font = "Arial#16";
FONT* LBG_progressbar_font = "Arial#24b";
FONT* LBG_listitem_font = "Arial#24b";
FONT* LBG_editbox_font = "Arial#24b";
FONT* LBG_digits_font = "Arial#24b";
Sie können die Fonts jederzeit ändern:
ptr_remove(LBG_button_font); // Remove the old font
LBG_button_font = font_create("Arial#20bi"); // Create the new one
Bitte beachten: LBGUI wurde nicht mit Bitmap-Fonts getestet.

Mauspfeil

LBGUI kann den Mauspfeil ändern, allerdings nicht direkt, sondern über die globale var LBG_mouse_cursor. Ihr Wert beinhaltet eine "Empfehlung" für den Mauspfeil:

0 - Standard (Pfeil)
1
- Button (Hand)
2 - Horizontale Fenstergröße (Doppelpfeil)
3 - Vertikale Fenstergröße
4 - Diagonale Fenstergröße (oben links <-> unten rechts)
5 - Diagonale Fenstergröße (oben rechts<-> unten links)
6 - Editbox

Per Skript kann dann die Maus-Bitmap entsprechend geändert werden.

Events

LBGUI Elemente haben Events, die von verschiedenen Auslösern gestartet werden, etwa wenn eine Schaltfläche geklickt oder ein Fenster geschlossen wird. Für jeden Auslöser gibt es einen eigenen Event. Alle Event-Namen beginnen mit einem Großbuchstaben. Sie können wie Entity-Events zugeordnet werden:
mywindow->Maximize = myfunction; // Execute myfunction when the maximize button of the window is pressed.
Wenn ein Event ausgelöst wird, kann auf das GUI-Element, das es ausgelöst hat, per LBG_event_object zugegriffen werden. Es gibt auch Pointer, die spezifisch für das Objekt, das den Event ausgelöst hat, wie folgt definiert sind:
LBG_WINDOW* LBG_event_object;
LBG_WINDOW* LBG_event_window;
LBG_BUTTON* LBG_event_button;
LBG_PANEL* LBG_event_panel;
LBG_TEXT* LBG_event_text;
LBG_CHECKBOX* LBG_event_checkbox;
LBG_INFOBOX* LBG_event_infobox;
LBG_PROGRESSBAR* LBG_event_progressbar;
LBG_HSCROLLBAR* LBG_event_scrollbar;
LBG_HSCROLLBAR* LBG_event_hscrollbar;
LBG_VSCROLLBAR* LBG_event_vscrollbar;
LBG_SLIDER* LBG_event_slider;
LBG_LISTBOX* LBG_event_listbox;
LBG_LISTITEM* LBG_event_listitem;
LBG_RIGHTCLICK* LBG_event_rightclick;
LBG_COMBOBOX* LBG_event_combobox;
LBG_DIGITS* LBG_event_digits;
LBG_EDITBOX* LBG_event_editbox;

Credits and Lizenz

LBGUI, das Handbuch und die Demos wurden von Lukas Brozio geschrieben. Die Grafiken stammen von Spike. Einige wurden von Lukas Brozio erstellt, zumeist durch Editieren von Spike's Grafiken.

LBGUI ist Open Source. Sie können es für jedes kommerzielle oder andere Projekt verwenden, wenn Sie den Autor in den Credits des Projekts erwähnen.

Siehe auch:

strio.c

► latest version online