Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

DeGUI V1.21

Uploader:MitgliedDonStevone
Datum/Zeit:28.12.2011 15:22:47

'    =======================================================================
'    =                                                                     =
'    =             DeGUI - Damn easy - Graphical user interface            =
'    =                                                                     =
'    =             Autor  : Steven Mahnke alias DonStevone                 =
'    =             Datum  : 31.10.2011                                     =
'    =             Lizens : FreeBASIC-Portal-Standartlizenz(FBPSL)         =
'    =             Version: 1.21                                           =
'    =                                                                     =
'    =======================================================================

'    =======================================================================
'    =                                  GUI                                =
'    =======================================================================
'
'    Function NewLabel          (X as Integer, Y as Integer, Text as String)                                                            as Integer
'    Function NewCheckbox       (X as Integer, Y as Integer, ID as String, Event as Sub(ID as String))                                  as Integer
'    Function NewTextField      (X as Integer, Y as Integer, Laenge as Integer)                                                         as Integer
'    Function NewTextField      (X as Integer, Y as Integer, Laenge as Integer, Text as String)                                         as Integer
'    Function NewRollTextField  (X as Integer, Y as Integer, Laenge as Integer)                                                         as Integer
'    Function NewRollTextField  (X as Integer, Y as Integer, Laenge as Integer, Text as String)                                         as Integer
'    Function NewPWTextField    (X as Integer, Y as Integer, Laenge as Integer)                                                         as Integer
'    Function NewButton         (X as Integer, Y as Integer, File as String, File2 as String, ID as String, Event as Sub(ID as String)) as Integer
'    Function NewButton         (X as Integer, Y as Integer, File as String, ID as String, Event as Sub(ID as String))                  as Integer
'    Function NewButton         (BText as String, X as Integer, Y as Integer, ID as String, Event as Sub(ID as String))                 as Integer
'
'    Die Funktionen geben einen Integer zurück, welcher repräsentativ für das
'    jeweilige Element steht. Diesen Integer kann man an nachfolgende Funktionen
'    übergeben.
'    Für Informationen über die Parameter siehe weiter unten.
'
'    Function GetLabelPTR           (Nr as Integer)    as Label PTR
'    Function GetCheckBoxPTR        (Nr as Integer)    as Checkbox PTR
'    Function GetTextFieldPTR       (Nr as Integer)    as TextField PTR
'    Function GetRollTextFieldPTR   (Nr as Integer)    as RollTextField PTR
'    Function GetPWTextFieldPTR     (Nr as Integer)    as PWTextField PTR
'    Function GetButtonPTR          (Nr as Integer)    as Button PTR
'
'    Diese Funktionen liefern den Pointer auf ein einzelnes Element zurück.
'    Wurde ein ungültiger Wert übergeben, wird eine 0 zurückgegeben.
'    Mit diesem Pointer hat man die möglichkeit einzelne Elemente zu Steuern.
'
'    Sub GUIStart()
'
'    Startet die graphische darstellung der Elemente und die Kontrollfunktionen
'    in einem Thread
'
'    Sub GUIStop()
'
'    Stoppt den Thread
'
'    !!!Alternativ zu GUIStart() um flimmern zu verhindern!!!
'
'    G()
'    Alle Elemente Graphisch darstellen.
'
'    GClear()
'    Alle Elemente auf dem Bildschirm löschen.
'
'    Control()
'    Alle Elemente steuern.
'
'    =======================================================================
'    =                                Button                               =
'    =======================================================================
'
'    Declare Constructor(ButtID as String, Event as Sub(ID as String), _
'                        ButtX as Integer, ButtY as Integer, _
'                        FileName as String, FileName2 as String)
'
'   -ButtID ist die ID die an das Event übergeben wird sobalt der Button geklickt wurde
'   -Event ist ein Handle auf eine Sub
'   -ButtX und ButtY sind die Koordinaten der linken oberen Ecke
'   -FileName ist der Name einer BMP welche als Button verwendet werden soll
'   -FileName2 ist der Name einer BMP welche als Button verwendet werde soll, aber nur
'       dann angezeigt wird wenn sich der Mauszeiger über dem Button befindet
'
'
'    Declare Constructor(ButtID as String, Event as Sub(ID as String), _
'                        ButtX as Integer, ButtY as Integer, _
'                        FileName as String)
'
'   -Siehe ersten Constructor - Unterschied: Hier wird kein alternativer Button angezeigt,
'       wenn man mit der Maus über diesen geht
'
'
'    Declare Constructor(ButtID as String, Event as Sub(ID as String), ButtText as String, ButtX as Integer, ButtY as Integer)
'
'   -Hier wird ein 'Standart Button verwendet (Ohne Bild)
'   -ButtText ist ein Text welcher auf dem Button stehen soll
'
'   Methoden:
'
'   Hide()
'   Versteckt den Button
'
'   Show()
'   Zeigt den Button
'
'   Control() !Wichtig!
'   Steuerung des Buttons
'
'   GClear()
'   Überzeichnet den Button mit einer schwarzen Box
'
'   G() !Wichtig!
'   Zeichnet den Button
'
'
'
'   ========================================================================
'   =                              TextField                               =
'   ========================================================================
'
'   Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer)
'
'   XPos ist die XKoordinate der linken oberen Ecke
'   YPos ist die YKoordinate der linken oberen Ecke
'   Laenge ist die maximale Anzahl an Zeichen innerhalb der Textbox
'
'   Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer, SText as String)
'
'   Siehe Constructor 1 - Unterschied: Mit SText kann ein String vordefiniert werden,
'       der in der Textbox angezeigt werden soll
'
'
'
'   Methoden:
'
'   Hide()
'   Versteckt die Textbox
'
'   Show()
'   Zeigt die Textbox
'
'   Control() !Wichtig!
'   Steuerung der Textbox
'
'   GClear()
'   Überzeichnet die Textbox mit einer schwarzen Box
'
'   G() !Wichtig!
'   Zeichnet die Textbox
'
'
'
'   Public Attribute:
'   Text as String - Das ist die Stringvariable in der der Text innerhalb der Textbox steht
'
'
'
'   ========================================================================
'   =                            RollTextField                             =
'   ========================================================================
'
'   Siehe TextField
'
'   Unterschied: Der Text im Textfeld wird gerollt(Nur die letzten 'Laenge'
'                Zeichen werden im Textfeld angezeigt). Dadurch kann man das
'                Textfeld mit beliebig vielen Zeichen füllen.
'
'
'   ========================================================================
'   =                            PWTextField                               =
'   ========================================================================
'
'   Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer)
'
'   Siehe TextField
'
'   Unterschied: Jedes Zeichen im PWTextField wird nur durch ein '*' dargestellt.
'
'
'
'   ========================================================================
'   =                               Label                                  =
'   ========================================================================
'
'   Declare Constructor(XPos as Integer, YPos as Integer, SText as String)
'
'   XPos ist die XKoordinate der linken oberen Ecke des Labels
'   YPos ist die YKoordinate der linken oberen Ecke des Labels
'   SText ist der Text welcher auf dem Label steht
'
'   Methoden:
'
'   Hide()
'   Versteckt das Label
'
'   Show()
'   Zeigt das Label
'
'   GClear()
'   Überzeichnet das Label mit einer schwarzen Box
'
'   G()
'   Zeichnet das Label
'
'
'
'   ========================================================================
'   =                                Checkbox                              =
'   ========================================================================
'
'   Declare Constructor(XPos as Integer, YPos as Integer, CheckID as String, Event as Sub(ID as String))
'
'   XPos ist die XKoordinate der linken oberen Ecke der Checkbox
'   YPos ist die YKoordinate der linken oberen Ecke der Checkbox
'   CheckID ist die ID die an das Event übergeben wird sobalt sich der Status der Checkbox geändert hat
'   Event ist ein Handle auf eine Sub
'
'   Methoden:
'
'   Hide()
'   Versteckt die Checkbox
'
'   Show()
'   Zeigt die Checkbox
'
'   Control() !Wichtig!
'   Steuerung der Checkbox
'
'   GClear()
'   Überzeichnet die Checkbock mit einer schwarzen Box
'
'   G()
'   Zeichnet die Checkbox
'
'   Public Attribute:
'
'   Checked as Byte - Aktueller Status der Checkbox

Type Button
    Private:
    X           as Integer
    Y           as Integer
    ButtWidth   as Integer
    ButtHeight  as Integer
    BColor      as UInteger
    TColor      as UInteger
    Text        as String
    ButtIMG     as Any PTR
    ButtIMG2    as Any PTR
    Thread      as Any PTR
    ID          as String
    ExtEvent    as Sub(ID as String)
    ButtType    as Byte
    H           as Byte
    MOver       as Byte

    Declare Sub GetSize(ByVal Dateiname as String, ByRef Breite as UInteger, ByRef Hoehe as UInteger)

    Public:
    Declare Constructor(ButtID as String, Event as Sub(ID as String), _
                        ButtX as Integer, ButtY as Integer, _
                        FileName as String, FileName2 as String)
    Declare Constructor(ButtID as String, Event as Sub(ID as String), _
                        ButtX as Integer, ButtY as Integer, _
                        FileName as String)
    Declare Constructor(ButtID as String, Event as Sub(ID as String), ButtText as String, ButtX as Integer, ButtY as Integer)
    Declare Destructor
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub Control()
    Declare Sub GClear(BgColor as UByte)
    Declare Sub G()
End Type

'###############################################################################
Constructor Button(ButtID as String, Event as Sub(ID as String), _
                    ButtX as Integer, ButtY as Integer, _
                    FileName as String, FileName2 as String)

    ID = ButtID
    ExtEvent = Event
    X = ButtX
    Y = ButtY
    ButtType = 1

    GetSize(FileName, ButtWidth, ButtHeight)
    ButtIMG = Imagecreate(ButtWidth, ButtHeight)
    BLoad FileName, ButtIMG
    GetSize(FileName2, ButtWidth, ButtHeight)
    ButtIMG2 = Imagecreate(ButtWidth, ButtHeight)
    BLoad FileName2, ButtIMG2
    If ButtIMG  = 0 then ?!"Something went wrong while loading File in: Constructor Button(ButtID as String, Event as Sub(ID as String), ButtX as Integer, ButtY as Integer, FileName as String)\nAre you sure this was the correct filename?"
    If ButtIMG2 = 0 then ?!"Something went wrong while loading File in: Constructor Button(ButtID as String, Event as Sub(ID as String), ButtX as Integer, ButtY as Integer, FileName as String)\nAre you sure this was the correct filename?"
End Constructor

'###############################################################################
Constructor Button(ButtID as String, Event as Sub(ID as String), _
                    ButtX as Integer, ButtY as Integer, _
                    FileName as String)

    ID = ButtID
    ExtEvent = Event
    X = ButtX
    Y = ButtY
    ButtType = 1

    GetSize(FileName, ButtWidth, ButtHeight)
    ButtIMG = Imagecreate(ButtWidth, ButtHeight)
    BLoad FileName, ButtIMG
    If ButtIMG = 0 then ?!"Something went wrong while loading File in: Constructor Button(ButtID as String, Event as Sub(ID as String), ButtX as Integer, ButtY as Integer, FileName as String)\nAre you sure this was the correct filename?"
End Constructor

'###############################################################################
Constructor Button(ButtID as String, Event as Sub(ID as String), ButtText as String, ButtX as Integer, ButtY as Integer)

    ID          = ButtID
    ExtEvent    = Event
    X           = ButtX
    Y           = ButtY
    ButtWidth   = LEN(ButtText) * 8 + 2
    ButtHeight  = 10
    BColor      = &hA0A0FF
    TColor      = &h000000
    Text        = ButtText
    ButtIMG     = Imagecreate(ButtWidth, ButtHeight, BColor, 32)
    ButtIMG2    = Imagecreate(ButtWidth, ButtHeight, TColor, 32)

    Draw String ButtIMG, (1, 1), Text, TColor
    Draw String ButtIMG2, (1, 1), Text, BColor
End Constructor

'###############################################################################
Destructor Button
    Deallocate ButtIMG
End Destructor

'###############################################################################
Sub Button.G()
    If H = 0 then
        If MOver = 1 and ButtIMG2 <> 0 then Put (X, Y), ButtIMG2, ALPHA, 255
        If MOver = 0 then Put (X, Y), ButtIMG, ALPHA, 255
    Endif
End Sub

'###############################################################################
Sub Button.GetSize(ByVal Dateiname as String, ByRef Breite as UInteger, ByRef Hoehe as UInteger)
    Dim as UByte B1, B2
    Dim as Integer File = Freefile
    Dim as UInteger B, H

    Open Dateiname for Input as File
    Get #File,, B1
    Get #File,, B2
    If B1 <> 66 and B2 <> 77 then
        Hoehe = 0
        Breite = 0
    Else
        Seek File, 19
        Get #File,, B
        Seek File, 23
        Get #File,, H
        Breite = B
        Hoehe = H
    Endif
End Sub

'###############################################################################
Sub Button.Hide()
    H = 1
End Sub

'###############################################################################
Sub Button.Show()
    H = 0
End Sub

'###############################################################################
Sub Button.Control()
    Dim as Integer MX, MY, MB

    If H = 0 then
        GetMouse(MX, MY,, MB)
        If MX > X and MX < X + ButtWidth and MY > Y and MY < Y + ButtHeight then
            MOver = 1
            IF MB = 1 then ExtEvent(ID)
        Else
            MOver = 0
        Endif
    Endif
End Sub

'###############################################################################
Sub Button.GClear(BgColor as UByte)
    Line (X, Y) - (X + ButtWidth, Y + ButtHeight), BgColor, BF
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type TextField
    Text        as String
    Private:
    X           as Integer
    Y           as Integer
    H           as Byte
    MOver       as Byte
    Auswahl     as Byte
    L           as Integer


    Public:
    Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer)
    Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer, SText as String)
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub Control()
    Declare Sub GClear()
    Declare Sub G()
End Type

'###############################################################################
Constructor TextField(XPos as Integer, YPos as Integer, Laenge as Integer)
    X = XPos
    Y = YPos
    L = Laenge
End Constructor

'###############################################################################
Constructor TextField(XPos as Integer, YPos as Integer, Laenge as Integer, SText as String)
    X = XPos
    Y = YPos
    L = Laenge
    Text = SText
End Constructor

'###############################################################################
Sub TextField.G()
    If H = 0 then
        Line(X, Y) - (X + L * 8, Y + 8), &hFFFFFF, BF
        Line(X, Y) - (X + L * 8, Y + 8), &hBBBBBB, B
        Draw String(X + 1, Y + 1), Text, &h000000
    Endif
End Sub

'###############################################################################
Sub TextField.Hide()
    H = 1
End Sub

'###############################################################################
Sub TextField.Show()
    H = 0
End Sub

'###############################################################################
Sub TextField.Control()
    Dim as Integer MX, MY, MB
    Dim as String T

    If H = 0 then
        GetMouse(MX, MY,, MB)
        If MX > X and MX < X + L * 8 and MY > Y and MY < Y + 8 then
            IF MB = 1 then
                Auswahl = 1
                T = "a"
                Do While(Len(T) = 1)
                    T = Inkey()
                    Sleep 10
                Loop
            Endif
        Else
            If MB = 1 then Auswahl = 0
        Endif
    Endif
    If Auswahl = 1 then
        T = Inkey()

        If ASC(Mid(T, 1, 1)) = 8 then
            Text = Mid(Text, 1, Len(Text) - 1)
        ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then
            If Len(Text) < L then Text += T
        ElseIf ASC(Mid(T, 1, 1)) = 13 then
            Auswahl = 0
        'Else
            'If Len(Text) < L then Text += T
        Endif
    Endif
End Sub

'###############################################################################
Sub TextField.GClear()
    If H = 0 then
        Line (X, Y) - (X + L * 8, Y + 8), 0, BF
    Endif
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type RollTextField
    Text        as String
    Private:
    X           as Integer
    Y           as Integer
    H           as Byte
    MOver       as Byte
    Auswahl     as Byte
    L           as Integer


    Public:
    Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer)
    Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer, SText as String)
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub Control()
    Declare Sub GClear()
    Declare Sub G()
End Type

'###############################################################################
Constructor RollTextField(XPos as Integer, YPos as Integer, Laenge as Integer)
    X = XPos
    Y = YPos
    L = Laenge
End Constructor

'###############################################################################
Constructor RollTextField(XPos as Integer, YPos as Integer, Laenge as Integer, SText as String)
    X = XPos
    Y = YPos
    L = Laenge
    Text = SText
End Constructor

'###############################################################################
Sub RollTextField.G()
    If H = 0 then
        Line(X, Y) - (X + L * 8, Y + 8), &hFFFFFF, BF
        Line(X, Y) - (X + L * 8, Y + 8), &hBBBBBB, B
        If LEN(Text) > L then
            Draw String(X + 1, Y + 1), Mid(Text, LEN(Text) - L + 1, L + 1), &h000000
        Else
            Draw String(X + 1, Y + 1), Mid(Text, 1, L), &h000000
        Endif

    Endif
End Sub

'###############################################################################
Sub RollTextField.Hide()
    H = 1
End Sub

'###############################################################################
Sub RollTextField.Show()
    H = 0
End Sub

'###############################################################################
Sub RollTextField.Control()
    Dim as Integer MX, MY, MB
    Dim as String T

    If H = 0 then
        GetMouse(MX, MY,, MB)
        If MX > X and MX < X + L * 8 and MY > Y and MY < Y + 8 then
            IF MB = 1 then
                Auswahl = 1
                T = "a"
                Do While(Len(T) = 1)
                    T = Inkey()
                    Sleep 10
                Loop
            Endif
        Else
            If MB = 1 then Auswahl = 0
        Endif
    Endif
    If Auswahl = 1 then
        T = Inkey()

        If ASC(Mid(T, 1, 1)) = 8 then
            Text = Mid(Text, 1, Len(Text) - 1)
        ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then
            Text += T
        ElseIf ASC(Mid(T, 1, 1)) = 13 then
            Auswahl = 0
        Endif
    Endif
End Sub

'###############################################################################
Sub RollTextField.GClear()
    If H = 0 then
        Line (X, Y) - (X + L * 8, Y + 8), 0, BF
    Endif
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type PWTextField
    Text        as String
    Private:
    X           as Integer
    Y           as Integer
    H           as Byte
    MOver       as Byte
    Auswahl     as Byte
    L           as Integer


    Public:
    Declare Constructor(XPos as Integer, YPos as Integer, Laenge as Integer)
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub Control()
    Declare Sub GClear()
    Declare Sub G()
End Type

'###############################################################################
Constructor PWTextField(XPos as Integer, YPos as Integer, Laenge as Integer)
    X = XPos
    Y = YPos
    L = Laenge
End Constructor

'###############################################################################
Sub PWTextField.G()
    If H = 0 then
        Line(X, Y) - (X + L * 8, Y + 8), &hFFFFFF, BF
        Line(X, Y) - (X + L * 8, Y + 8), &hBBBBBB, B
        Draw String(X + 1, Y + 1), String(LEN(Text), "*"), &h000000
    Endif
End Sub

'###############################################################################
Sub PWTextField.Hide()
    H = 1
End Sub

'###############################################################################
Sub PWTextField.Show()
    H = 0
End Sub

'###############################################################################
Sub PWTextField.Control()
    Dim as Integer MX, MY, MB
    Dim as String T

    If H = 0 then
        GetMouse(MX, MY,, MB)
        If MX > X and MX < X + L * 8 and MY > Y and MY < Y + 8 then
            IF MB = 1 then
                Auswahl = 1
                T = "a"
                Do While(Len(T) = 1)
                    T = Inkey()
                    Sleep 10
                Loop
            Endif
        Else
            If MB = 1 then Auswahl = 0
        Endif
    Endif
    If Auswahl = 1 then
        T = Inkey()

        If ASC(Mid(T, 1, 1)) = 8 then
            Text = Mid(Text, 1, Len(Text) - 1)
        ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then
            If Len(Text) < L then Text += T
        ElseIf ASC(Mid(T, 1, 1)) = 13 then
            Auswahl = 0
        Endif
    Endif
End Sub

'###############################################################################
Sub PWTextField.GClear()
    If H = 0 then
        Line (X, Y) - (X + L * 8, Y + 8), 0, BF
    Endif
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type Label
    Private:
    X           as Integer
    Y           as Integer
    H           as Byte
    MOver       as Byte
    L           as Integer
    Text        as String


    Public:
    Declare Constructor(XPos as Integer, YPos as Integer, SText as String)
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub GClear()
    Declare Sub G()
End Type

'###############################################################################
Constructor Label(XPos as Integer, YPos as Integer, SText as String)
    X = XPos
    Y = YPos
    L = Len(SText)
    Text = SText
End Constructor

'###############################################################################
Sub Label.G()
    If H = 0 then
        Line(X, Y) - (X + L * 8, Y + 8), &h808080, BF
        Draw String(X + 1, Y + 1), Text, &h000000
    Endif
End Sub

'###############################################################################
Sub Label.Hide()
    H = 1
End Sub

'###############################################################################
Sub Label.Show()
    H = 0
End Sub

'###############################################################################
Sub Label.GClear()
    If H = 0 then
        Line (X, Y) - (X + L * 8, Y + 8), 0, BF
    Endif
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type Checkbox
    Checked     as Byte
    Private:
    X           as Integer
    Y           as Integer
    ButtIMG     as Byte PTR
    ButtIMG2    as Byte PTR
    ID          as String
    ExtEvent    as Sub(ID as String)
    H           as Byte
    MOver       as Byte
    MLock       as Byte


    Public:
    Declare Constructor(XPos as Integer, YPos as Integer, CheckID as String, Event as Sub(ID as String))
    Declare Destructor
    Declare Sub Hide()
    Declare Sub Show()
    Declare Sub Control()
    Declare Sub GClear()
    Declare Sub G()
End Type

'###############################################################################
Constructor Checkbox(XPos as Integer, YPos as Integer, CheckID as String, Event as Sub(ID as String))
    X = XPos
    Y = YPos
    ID = CheckID
    ExtEvent = Event
    Checked = 0

    ButtIMG  = Imagecreate(15, 15, &hFFFFFF, 32)
    Line ButtIMG, (1, 1) - (13, 13), &h000000, BF

    ButtIMG2 = Imagecreate(15, 15, &hFFFFFF, 32)
    Line ButtIMG2, (1, 1) - (13, 13), &h000000, BF
    Line ButtIMG2, (1, 1) - (15, 15), &hFFFFFF
    Line ButtIMG2, (13, 1) - (1, 13), &hFFFFFF

End Constructor

'###############################################################################
Destructor Checkbox
    If ButtIMG  <> 0 then ImageDestroy ButtIMG
    If ButtIMG2 <> 0 then ImageDestroy ButtIMG2
End Destructor

'###############################################################################
Sub Checkbox.G()
    If H = 0 then
        If Checked = 1 then Put (X, Y), ButtIMG2, ALPHA, 255
        If Checked = 0 then Put (X, Y), ButtIMG, ALPHA, 255
    Endif
End Sub

'###############################################################################
Sub Checkbox.Hide()
    H = 1
End Sub

'###############################################################################
Sub Checkbox.Show()
    H = 0
End Sub

'###############################################################################
Sub Checkbox.Control()
    Dim as Integer MX, MY, MB

    If H = 0 then
        GetMouse(MX, MY,, MB)
        If MX > X and MX < X + 15 and MY > Y and MY < Y + 15 and MLock = 0 then
            IF MB = 1 then
                Checked += 1
                If Checked > 1 then Checked = 0
                ExtEvent(ID)
            Endif
        Endif
        If MB = 1 then MLock = 1 else MLock = 0
    Endif
End Sub

'###############################################################################
Sub Checkbox.GClear()
    If H = 0 then
        Line (X, Y) - (X + 25, Y + 25), 0, BF
    Endif
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type TimeControlUDT
    Declare Constructor(FPS as Integer)
    Declare Sub ControlTime()
    Declare Sub SetFPS(FPS as Integer)

    Private:
    Temp1 as Double
    StartTime as Double
    DurchlaeufeS as Integer
End Type

Constructor TimeControlUDT(FPS as Integer)
    DurchlaeufeS = FPS
End Constructor

Sub TimeControlUDT.ControlTime()
    If StartTime > 0 then
        Temp1 = INT(1000 - (Timer - StartTime) * DurchlaeufeS)
        Temp1 = Temp1 \ DurchlaeufeS
        If Temp1 > 0 then Sleep Temp1, 1
    Endif
    StartTime = Timer
End Sub

Sub TimeControlUDT.SetFPS(FPS as Integer)
    DurchlaeufeS = FPS
End Sub

'###############################################################################
'###############################################################################
'###############################################################################
Type GUI
    Public:
    Declare Destructor
    Declare Constructor()

    Declare Function NewLabel(X as Integer, Y as Integer, Text as String) as Integer
    Declare Function NewCheckbox(X as Integer, Y as Integer, ID as String, Event as Sub(ID as String)) as Integer
    Declare Function NewTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    Declare Function NewTextField(X as Integer, Y as Integer, Laenge as Integer, Text as String) as Integer
    Declare Function NewRollTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    Declare Function NewRollTextField(X as Integer, Y as Integer, Laenge as Integer, Text as String) as Integer
    Declare Function NewPWTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    Declare Function NewButton(X as Integer, Y as Integer, File as String, File2 as String, ID as String, Event as Sub(ID as String)) as Integer
    Declare Function NewButton(X as Integer, Y as Integer, File as String,                  ID as String, Event as Sub(ID as String)) as Integer
    Declare Function NewButton(BText as String, X as Integer, Y as Integer, ID as String, Event as Sub(ID as String)) as Integer

    Declare Function GetLabelPTR(Nr as Integer) as Label PTR
    Declare Function GetCheckBoxPTR(Nr as Integer) as Checkbox PTR
    Declare Function GetTextFieldPTR(Nr as Integer) as TextField PTR
    Declare Function GetRollTextFieldPTR(Nr as Integer) as RollTextField PTR
    Declare Function GetPWTextFieldPTR(Nr as Integer) as PWTextField PTR
    Declare Function GetButtonPTR(Nr as Integer) as Button PTR

    Declare Sub G()
    Declare Sub Control()
    Declare Sub GClear()

    Declare Sub GUIStart()
    Declare Sub GUIStop()

    Private:
    Declare Static Sub GUIUpdate(ByRef GUIPTR as GUI)

    As Label PTR PTR LabelArr
    As Integer LabelSize

    As Checkbox PTR PTR CheckArr
    As Integer CheckSize

    As TextField PTR PTR TextFieldArr
    As Integer TextFieldSize

    As RollTextField PTR PTR RollTextFieldArr
    As Integer RollTextFieldSize

    As PWTextField PTR PTR PWTextFieldArr
    As Integer PWTextFieldSize

    As Button PTR PTR ButtonArr
    As Integer ButtonSize

    As Byte Threadstop
    As TimeControlUDT FPS = TimeControlUDT(60)
End Type

'###############################################################################
Constructor GUI()
    LabelArr         = Allocate(SizeOf(Label PTR))
    CheckArr         = Allocate(SizeOf(CheckBox PTR))
    TextFieldArr     = Allocate(SizeOf(TextField PTR))
    RollTextFieldArr = Allocate(SizeOf(RollTextField PTR))
    PWTextFieldArr   = Allocate(SizeOf(PWTextField PTR))
    ButtonArr        = Allocate(SizeOf(Button PTR))
End Constructor

'###############################################################################
Destructor GUI
End Destructor

'###############################################################################
Function GUI.NewLabel(X as Integer, Y as Integer, Text as String) as Integer
    LabelArr[LabelSize] = New Label(X, Y, Text)
    LabelSize += 1
    LabelArr = ReAllocate(LabelArr, SizeOf(Label PTR) * (LabelSize + 1))
    Return LabelSize
End Function

'###############################################################################
Function GUI.NewCheckbox(X as Integer, Y as Integer, ID as String, Event as Sub(ID as String)) as Integer
    CheckArr[CheckSize] = New Checkbox(X, Y, ID, Event)
    CheckSize += 1
    CheckArr = ReAllocate(CheckArr, SizeOf(CheckBox PTR) * (CheckSize + 1))
    Return CheckSize
End Function

'###############################################################################
Function GUI.NewTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    TextFieldArr[TextFieldSize] = New TextField(X, Y, Laenge)
    TextFieldSize += 1
    TextFieldArr = ReAllocate(TextFieldArr, SizeOf(TextField PTR) * (TextFieldSize + 1))
    Return TextFieldSize
End Function

'###############################################################################
Function GUI.NewTextField(X as Integer, Y as Integer, Laenge as Integer, Text as String) as Integer
    TextFieldArr[TextFieldSize] = New TextField(X, Y, Laenge, Text)
    TextFieldSize += 1
    TextFieldArr = ReAllocate(TextFieldArr, SizeOf(TextField PTR) * (TextFieldSize + 1))
    Return TextFieldSize
End Function

'###############################################################################
Function GUI.NewRollTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    RollTextFieldArr[RollTextFieldSize] = New RollTextField(X, Y, Laenge)
    RollTextFieldSize += 1
    RollTextFieldArr = ReAllocate(RollTextFieldArr, SizeOf(RollTextField PTR) * (RollTextFieldSize + 1))
    Return RollTextFieldSize
End Function

'###############################################################################
Function GUI.NewRollTextField(X as Integer, Y as Integer, Laenge as Integer, Text as String) as Integer
    RollTextFieldArr[RollTextFieldSize] = New RollTextField(X, Y, Laenge, Text)
    RollTextFieldSize += 1
    RollTextFieldArr = ReAllocate(RollTextFieldArr, SizeOf(RollTextField PTR) * (RollTextFieldSize + 1))
    Return RollTextFieldSize
End Function

'###############################################################################
Function GUI.NewPWTextField(X as Integer, Y as Integer, Laenge as Integer) as Integer
    PWTextFieldArr[PWTextFieldSize] = New PWTextField(X, Y, Laenge)
    PWTextFieldSize += 1
    PWTextFieldArr = ReAllocate(PWTextFieldArr, SizeOf(PWTextField PTR) * (PWTextFieldSize + 1))
    Return PWTextFieldSize
End Function

'###############################################################################
Function GUI.NewButton(X as Integer, Y as Integer, File as String, File2 as String, ID as String, Event as Sub(ID as String)) as Integer
    ButtonArr[ButtonSize] = New Button(ID, Event, X, Y, File, File2)
    ButtonSize += 1
    ButtonArr = ReAllocate(ButtonArr, SizeOf(Button PTR) * (ButtonSize + 1))
    Return ButtonSize
End Function

'###############################################################################
Function GUI.NewButton(X as Integer, Y as Integer, File as String, ID as String, Event as Sub(ID as String)) as Integer
    ButtonArr[ButtonSize] = New Button(ID, Event, X, Y, File)
    ButtonSize += 1
    ButtonArr = ReAllocate(ButtonArr, SizeOf(Button PTR) * (ButtonSize + 1))
    Return ButtonSize
End Function

'###############################################################################
Function GUI.NewButton(BText as String, X as Integer, Y as Integer, ID as String, Event as Sub(ID as String)) as Integer
    ButtonArr[ButtonSize] = New Button(ID, Event, BText, X, Y)
    ButtonSize += 1
    ButtonArr = ReAllocate(ButtonArr, SizeOf(Button PTR) * (ButtonSize + 1))
    Return ButtonSize
End Function

'###############################################################################
Function GUI.GetLabelPTR(Nr as Integer) as Label PTR
    If Nr < 1 Or Nr > LabelSize then Return 0 Else Return LabelArr[Nr - 1]
End Function

'###############################################################################
Function GUI.GetCheckboxPTR(Nr as Integer) as Checkbox PTR
    If Nr < 1 Or Nr > CheckSize then Return 0 Else Return CheckArr[Nr - 1]
End Function

'###############################################################################
Function GUI.GetTextFieldPTR(Nr as Integer) as TextField PTR
    If Nr < 1 Or Nr > TextFieldSize then Return 0 Else Return TextFieldArr[Nr - 1]
End Function

'###############################################################################
Function GUI.GetRollTextFieldPTR(Nr as Integer) as RollTextField PTR
    If Nr < 1 Or Nr > RollTextFieldSize then Return 0 Else Return RollTextFieldArr[Nr - 1]
End Function

'###############################################################################
Function GUI.GetPWTextFieldPTR(Nr as Integer) as PWTextField PTR
    If Nr < 1 Or Nr > PWTextFieldSize then Return 0 Else Return PWTextFieldArr[Nr - 1]
End Function

'###############################################################################
Function GUI.GetButtonPTR(Nr as Integer) as Button PTR
    If Nr < 1 Or Nr > ButtonSize then Return 0 Else Return ButtonArr[Nr - 1]
End Function

'###############################################################################
Sub GUI.G()
    Dim as Integer a

    If LabelSize > 0 then
        For a = 0 to LabelSize - 1
            LabelArr[a]->G()
        Next a
    Endif
    If CheckSize > 0 then
        For a = 0 to CheckSize - 1
            CheckArr[a]->G()
        Next a
    Endif
    If TextFieldSize > 0 then
        For a = 0 to TextFieldSize - 1
            TextFieldArr[a]->G()
        Next a
    Endif
    If RollTextFieldSize > 0 then
        For a = 0 to RollTextFieldSize - 1
            RollTextFieldArr[a]->G()
        Next a
    Endif
    If PWTextFieldSize > 0 then
        For a = 0 to PWTextFieldSize - 1
            PWTextFieldArr[a]->G()
        Next a
    Endif
    If ButtonSize > 0 then
        For a = 0 to ButtonSize - 1
            ButtonArr[a]->G()
        Next a
    Endif
End Sub

'###############################################################################
Sub GUI.Control()
    Dim as Integer a

    If CheckSize > 0 then
        For a = 0 to CheckSize - 1
            CheckArr[a]->Control()
        Next a
    Endif
    If TextFieldSize > 0 then
        For a = 0 to TextFieldSize - 1
            TextFieldArr[a]->Control()
        Next a
    Endif
    If RollTextFieldSize > 0 then
        For a = 0 to RollTextFieldSize - 1
            RollTextFieldArr[a]->Control()
        Next a
    Endif
    If PWTextFieldSize > 0 then
        For a = 0 to PWTextFieldSize - 1
            PWTextFieldArr[a]->Control()
        Next a
    Endif
    If ButtonSize > 0 then
        For a = 0 to ButtonSize - 1
            ButtonArr[a]->Control()
        Next a
    Endif
End Sub

'###############################################################################
Sub GUI.GClear()
    Dim as Integer a

    If LabelSize > 0 then
        For a = 0 to LabelSize - 1
            LabelArr[a]->GClear()
        Next a
    Endif
    If CheckSize > 0 then
        For a = 0 to CheckSize - 1
            CheckArr[a]->GClear()
        Next a
    Endif
    If TextFieldSize > 0 then
        For a = 0 to TextFieldSize - 1
            TextFieldArr[a]->GClear()
        Next a
    Endif
    If RollTextFieldSize > 0 then
        For a = 0 to RollTextFieldSize - 1
            RollTextFieldArr[a]->GClear()
        Next a
    Endif
    If PWTextFieldSize > 0 then
        For a = 0 to PWTextFieldSize - 1
            PWTextFieldArr[a]->GClear()
        Next a
    Endif
    If ButtonSize > 0 then
        For a = 0 to ButtonSize - 1
            ButtonArr[a]->GClear(&h000000)
        Next a
    Endif
End Sub

'###############################################################################
Static Sub GUI.GUIUpdate(ByRef GUIPTR as GUI)
    While(GUIPTR.Threadstop = 0)
        GUIPTR.Control()
        GUIPTR.GClear()
        GUIPTR.G()

        GUIPTR.FPS.ControlTime()
    Wend
End Sub

'###############################################################################
Sub GUI.GUIStart()
    FPS.SetFPS(20)
    Threadcreate(CAST(Any PTR, @GUIUpdate), @This)
End Sub

Sub GUI.GUIStop()
    Threadstop = 1
End Sub