' ======================================================================= ' = = ' = DeGUI - Damn easy - Graphical user interface = ' = = ' = Autor : Steven Mahnke alias DonStevone = ' = Datum : 31.10.2011 = ' = Lizens : FreeBASIC-Portal-Standartlizenz(FBPSL) = ' = Version: 1.8 = ' = = ' ======================================================================= ' ======================================================================= ' = 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 ' Function NewRadioButton (ID as String, Event as Sub(ID as String)) as Integer ' Function NewElementList (XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) as Integer ' Function NewStrictTextArea (X as Integer, Y as Integer, TextWidth as Integer, TextHeight as Integer) 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 ' Function GetRadioButtonPTR (Nr as Integer) as RadioButton PTR ' Function GetElementListPTR (Nr as Integer) as ElementList PTR ' Function GetStrictTextAreaPTR (Nr as Integer) as StrictTextArea 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. ' ' Fehlerausgabe: ' ' Declare Sub DEGUIErrOut(Parameter as Integer = 1) ' Wird direkt am Anfang des Programms verwendet um zu prüfen ob eine Fehlermeldung ' vom Programm selbst übergeben wurde. Werden noch andere Parameter im Programm verwendet ' Kann man mit Parameter angeben welche Parameter verwendet werde sollen. ' Gibt man eine 2 an so wird der zweite ans Programm übergebene Parameter geprüft ob er ' 'ERROR' entspricht. Sollte das der Fall sein werden die nächsten beiden Parameter verwendet ' um ein Errorfenster anzuzeigen. ' ' Declare Sub DEGUIError(Title as String, ErrorMsg as String, Parameter as Integer = 1) ' Wird verwendet um einen Fehler auszugeben. Darauf zu achten ist, dass am Anfang des Programms ' die Sub DEGUIErrOut aufgerufen wird. Parameter muss mit der Parameter von DEGUIErrOut uebereinstimmen. ' ' ' ======================================================================= ' = 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 ' ' LockElement() ' Das TextFeld Laesst hier nach keine Eingaben mehr zu ' ' UnlockElement() ' Macht LockTextField() rückgängig ' ' ' ' 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 ' ' ' ' ======================================================================== ' = RadioButton = ' ======================================================================== ' ' Declare Constructor(ID as String, Event as Sub(ID as String)) ' ' Methoden: ' ' NewRadioButton(XPos as Integer, YPos as Integer) ' Erstellt einen neuen RadioButton bei den angegebenen Koordinaten ' ' Control() !Wichtig! ' Steuerung der RadioButtons ' ' GClear() ' Überzeichnet die RadioButtons mit einer schwarzen Box ' ' G() ' Zeichnet die RadioButtons ' ' Public Attribute: ' ' Active as Integer - Enthält den Wert des aktuell aktiven RadioButtons ' ' ' ' ======================================================================== ' = ElementList = ' ======================================================================== ' ' Declare Constructor(XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) ' ' Methoden: ' ' NewElement(ElementText as String, ElementID as String) as Byte ' Erstellt ein neues Element der ElementList ' ' Control() !Wichtig! ' Steuerung der ElementList ' ' GClear() ' Überzeichnet alle Elemente der ElementList mit einer schwarzen Box ' ' G() ' Zeichnet die Elemente der ElementList ' ' ' ' ======================================================================== ' = DropDown = ' ======================================================================== ' ' Declare Constructor(XPos as Integer, YPos as Integer, SText as String, Length as Integer) ' ' Methoden: ' ' NewElement(ElementText as String) as Byte ' Erstellt ein neues Element des DropDown ' ' Control() !Wichtig! ' Steuerung des DropDown ' ' GClear() ' Überzeichnet alle Elemente des DropDown mit einer schwarzen Box ' ' G() ' Zeichnet die Elemente des DropDown ' ' ' Public Attribute: ' Text as String ' ' ' ======================================================================== ' = StrictTextArea = ' ======================================================================== ' ' Declare Constructor(XPos as Integer, YPos as Integer, TWidth as Integer, THeight as Integer) ' ' Methoden: ' ' Control() !Wichtig! ' Steuerung des StrictTextAreas ' ' GClear() ' Überzeichnet das StrictTextArea mit einer schwarzen Box ' ' G() ' Zeichnet das StrictTextArea ' ' Hide() ' Unterdrückt die Graphische darstellung und die Steuerung des Elements ' ' Show() ' Macht Hide() rückgängig ' ' SetText(Msg as String) ' Sollte Msg laenger sein als die breite des StrictTextAreas werden automatisch ' Zeilenumbrueche eingefuegt ' ' LockElement() ' Das TextFeld Laesst hier nach keine Eingaben mehr zu ' ' UnlockElement() ' Macht LockTextField() rückgängig ' ' ' ' Public Attribute: ' Text as String ' ' Info: ' -Alle Newline-Zeichen in Text haben den ASCII-Wert 13 ' -Das StrictTextArea ist kein normales TextArea. Der Unterschied besteht darin, dass ' das STArea nur eine begrenzte Anzahl an Zeichen in eine Zeile aufnehmen kann. ' Auch die Anzahl der Zeilen ist vom Benutzer vordefiniert. Innerhalb des STAreas ' wird folglich nicht gescrollt. 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) Declare Sub DrawButton() 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 + 5 ButtHeight = 17 BColor = &hA0A0FF TColor = &h000000 Text = ButtText ButtIMG = Imagecreate(ButtWidth, ButtHeight, &hFF0000, 32) DrawButton() End Constructor '############################################################################### Destructor Button If ButtIMG <> 0 then DeAllocate(ButtIMG) If ButtIMG2 <> 0 then DeAllocate(ButtIMG2) End Destructor '############################################################################### Sub Button.G() If H = 0 then Put (X, Y), ButtIMG, ALPHA, 255 If MOver = 1 and ButtIMG2 <> 0 then Put (X, Y), ButtIMG2, 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 '############################################################################### Sub Button.DrawButton() If ButtIMG <> 0 then Line ButtIMG,(0, 0) - (Len(Text) * 8 + 4, 16), &hDDDDDD, B Line ButtIMG,(1, 1) - (Len(Text) * 8 + 3, 15), &hCCCCCC, BF Line ButtIMG,(0, 1) - (Len(Text) * 8 + 2, 2) , &hFFFFFF, BF Line ButtIMG,(2, 14) - (Len(Text) * 8 + 3, 15), &h666666, BF Line ButtIMG,(Len(Text) * 8 + 2, 2) - (Len(Text) * 8 + 3, 14), &h666666, BF Draw String ButtIMG, (3, 5), Text, &h000000 Endif End Sub '############################################################################### '############################################################################### '############################################################################### Type TextField Text as String MOver as Byte Private: X as Integer Y as Integer H as Byte Auswahl as Byte L as Integer CurCounter as Byte KeyLock as Byte CursorPos as Integer TStr1 as String TStr2 as String LockField as Byte Declare Sub SetCurPos() 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() Declare Sub LockElement() Declare Sub UnlockElement() 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.SetCurPos() Dim as Integer MX, MY, MB GetMouse MX, MY,, MB If MOver = 1 and MB = 1 then CursorPos = (MX - X - 1) / 8 If CursorPos > Len(Text) then CursorPos = Len(Text) Endif End Sub '############################################################################### Sub TextField.G() If H = 0 then If LockField = 0 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hFFFFFF, BF If LockField = 1 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hDDDDDD, BF Line(X, Y) - (X + L * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 1) - (X + L * 8 + 3, Y + 1), &h666666 Line(X + 1, Y + 1) - (X + 1, Y + 11), &h666666 Draw String(X + 3, Y + 4), Text, &h000000 If CurCounter > 0 and CurCounter < 40 and Auswahl = 1 then Line(X + CursorPos * 8 + 2, Y + 3) - (X + CursorPos * 8 + 2, Y + 10), &h000000 Endif Endif End Sub '############################################################################### Sub TextField.Hide() H = 1 End Sub '############################################################################### Sub TextField.Show() H = 0 End Sub '############################################################################### Sub TextField.Control() If LockField = 0 then Dim as Integer MX, MY, MB Dim as String T TStr1 = "" If CursorPos > 0 then TStr1 = MID(Text, 1, CursorPos) TStr2 = MID(Text, CursorPos + 1) SetCurPos() If H = 0 then GetMouse(MX, MY,, MB) If MX > X and MX < X + L * 8 + 6 and MY > Y and MY < Y + 12 then MOver = 1 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 MOver = 0 Endif Endif If Auswahl = 1 then T = Inkey() If ASC(Mid(T, 1, 1)) = 8 then TStr1 = Mid(TStr1, 1, Len(TStr1) - 1) If Len(TStr1) > -1 then CursorPos -= 1 ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then If Len(TStr1) + Len(TStr2) < L then TStr1 += T CursorPos += 1 Endif ElseIf ASC(Mid(T, 1, 1)) = 13 then Auswahl = 0 Endif Text = TStr1 & TStr2 If NOT Multikey(&h4B) And NOT Multikey(&h4D) then KeyLock = 0 If KeyLock = 0 then If Multikey(&h4B) then CursorPos -= 1 : KeyLock = 1 If Multikey(&h4D) then CursorPos += 1 : KeyLock = 1 Endif If CursorPos > Len(Text) then CursorPos = Len(Text) If CursorPos < 0 then CursorPos = 0 Endif CurCounter += 1 If CurCounter >= 80 then CurCounter = 0 Endif End Sub '############################################################################### Sub TextField.GClear() If H = 0 then Line (X, Y) - (X + L * 8 + 4, Y + 12), 0, BF Endif End Sub '############################################################################### Sub TextField.LockElement() LockField = 1 End Sub '############################################################################### Sub TextField.UnlockElement() LockField = 0 End Sub '############################################################################### '############################################################################### '############################################################################### Type RollTextField Text as String MOver as Byte Private: X as Integer Y as Integer H as Byte Auswahl as Byte L as Integer CurCounter as Byte KeyLock as Byte CursorPos as Integer TStr1 as String TStr2 as String LockField as Byte 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() Declare Sub SetCurPos() Declare Sub LockElement() Declare Sub UnlockElement() 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.SetCurPos() Dim as Integer MX, MY, MB GetMouse MX, MY,, MB If MOver = 1 and MB = 1 then CursorPos = (MX - X - 1) / 8 If CursorPos > Len(Text) then CursorPos = Len(Text) If LEN(Text) > L then CursorPos = LEN(Text) - L + INT((MX - X - 1) / 8) Endif End Sub '############################################################################### Sub RollTextField.G() If H = 0 then If LockField = 0 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hFFFFFF, BF If LockField = 1 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hDDDDDD, BF Line(X, Y) - (X + L * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 1) - (X + L * 8 + 3, Y + 1), &h666666 Line(X + 1, Y + 1) - (X + 1, Y + 11), &h666666 If LEN(Text) > L then Draw String(X + 3, Y + 4), Mid(Text, LEN(Text) - L + 1, L + 1), &h000000 Else Draw String(X + 3, Y + 4), Mid(Text, 1, L), &h000000 Endif If CurCounter > 0 and CurCounter < 40 and Auswahl = 1 then If LEN(Text) <= L then Line(X + CursorPos * 8 + 2, Y + 3) - (X + CursorPos * 8 + 2, Y + 10), &h000000 Else Line(X + (L - (LEN(Text) - CursorPos)) * 8 + 2, Y + 3) - (X + (L - (LEN(Text) - CursorPos)) * 8 + 2, Y + 10), &h000000 Endif Endif Endif End Sub '############################################################################### Sub RollTextField.Hide() H = 1 End Sub '############################################################################### Sub RollTextField.Show() H = 0 End Sub '############################################################################### Sub RollTextField.Control() If LockField = 0 then Dim as Integer MX, MY, MB Dim as String T TStr1 = "" If CursorPos > 0 then TStr1 = MID(Text, 1, CursorPos) TStr2 = MID(Text, CursorPos + 1) SetCurPos() If H = 0 then GetMouse(MX, MY,, MB) If MX > X and MX < X + L * 8 + 6 and MY > Y and MY < Y + 12 then MOver = 1 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 MOver = 0 Endif Endif If Auswahl = 1 then T = Inkey() If ASC(Mid(T, 1, 1)) = 8 then TStr1 = Mid(TStr1, 1, Len(TStr1) - 1) If Len(TStr1) > -1 then CursorPos -= 1 ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then TStr1 += T CursorPos += 1 ElseIf ASC(Mid(T, 1, 1)) = 13 then Auswahl = 0 Endif Text = TStr1 & TStr2 If NOT Multikey(&h4B) And NOT Multikey(&h4D) then KeyLock = 0 If KeyLock = 0 then If Multikey(&h4B) then CursorPos -= 1 : KeyLock = 1 If Multikey(&h4D) then CursorPos += 1 : KeyLock = 1 Endif If CursorPos > Len(Text) then CursorPos = Len(Text) If CursorPos < 0 then CursorPos = 0 If Len(Text) >= L then If CursorPos < Len(Text) - L then CursorPos = Len(Text) - L Endif Endif CurCounter += 1 If CurCounter >= 80 then CurCounter = 0 Endif End Sub '############################################################################### Sub RollTextField.GClear() If H = 0 then Line (X, Y) - (X + L * 8 + 4, Y + 12), 0, BF Endif End Sub '############################################################################### Sub RollTextField.LockElement() LockField = 1 End Sub '############################################################################### Sub RollTextField.UnlockElement() LockField = 0 End Sub '############################################################################### '############################################################################### '############################################################################### Type PWTextField Text as String MOver as Byte Private: X as Integer Y as Integer H as Byte Auswahl as Byte L as Integer CurCounter as Byte KeyLock as Byte CursorPos as Integer TStr1 as String TStr2 as String LockField as Byte Declare Sub SetCurPos() 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() Declare Sub LockElement() Declare Sub UnlockElement() End Type '############################################################################### Constructor PWTextField(XPos as Integer, YPos as Integer, Laenge as Integer) X = XPos Y = YPos L = Laenge End Constructor '############################################################################### Sub PWTextField.SetCurPos() Dim as Integer MX, MY, MB GetMouse MX, MY,, MB If MOver = 1 and MB = 1 then CursorPos = (MX - X - 1) / 8 If CursorPos > Len(Text) then CursorPos = Len(Text) Endif End Sub '############################################################################### Sub PWTextField.G() If H = 0 then If LockField = 0 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hFFFFFF, BF If LockField = 1 then Line(X, Y) - (X + L * 8 + 4, Y + 12), &hDDDDDD, BF Line(X, Y) - (X + L * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 1) - (X + L * 8 + 3, Y + 1), &h666666 Line(X + 1, Y + 1) - (X + 1, Y + 11), &h666666 Draw String(X + 3, Y + 4), String(LEN(Text), "*"), &h000000 If CurCounter > 0 and CurCounter < 40 and Auswahl = 1 then Line(X + CursorPos * 8 + 2, Y + 3) - (X + CursorPos * 8 + 2, Y + 10), &h000000 Endif Endif End Sub '############################################################################### Sub PWTextField.Hide() H = 1 End Sub '############################################################################### Sub PWTextField.Show() H = 0 End Sub '############################################################################### Sub PWTextField.Control() If LockField = 0 then Dim as Integer MX, MY, MB Dim as String T TStr1 = "" If CursorPos > 0 then TStr1 = MID(Text, 1, CursorPos) TStr2 = MID(Text, CursorPos + 1) SetCurPos() If H = 0 then GetMouse(MX, MY,, MB) If MX > X and MX < X + L * 8 + 6 and MY > Y and MY < Y + 12 then MOver = 1 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 MOver = 0 Endif Endif If Auswahl = 1 then T = Inkey() If ASC(Mid(T, 1, 1)) = 8 then TStr1 = Mid(TStr1, 1, Len(TStr1) - 1) If Len(TStr1) > -1 then CursorPos -= 1 ElseIf ASC(Mid(T, 1, 1)) >= 32 And ASC(Mid(T, 1, 1)) <= 126 then If Len(TStr1) + Len(TStr2) < L then TStr1 += T CursorPos += 1 Endif ElseIf ASC(Mid(T, 1, 1)) = 13 then Auswahl = 0 Endif Text = TStr1 & TStr2 If NOT Multikey(&h4B) And NOT Multikey(&h4D) then KeyLock = 0 If KeyLock = 0 then If Multikey(&h4B) then CursorPos -= 1 : KeyLock = 1 If Multikey(&h4D) then CursorPos += 1 : KeyLock = 1 Endif If CursorPos > Len(Text) then CursorPos = Len(Text) If CursorPos < 0 then CursorPos = 0 Endif CurCounter += 1 If CurCounter >= 80 then CurCounter = 0 Endif End Sub '############################################################################### Sub PWTextField.GClear() If H = 0 then Line (X, Y) - (X + L * 8 + 4, Y + 12), 0, BF Endif End Sub '############################################################################### Sub PWTextField.LockElement() LockField = 1 End Sub '############################################################################### Sub PWTextField.UnlockElement() LockField = 0 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 + 4, Y + 12), &hDDDDDD, BF Line(X, Y) - (X + L * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 11) - (X + L * 8 + 3, Y + 11), &h666666 Line(X + L * 8 + 3, Y + 1) - (X + L * 8 + 3, Y + 11), &h666666 Draw String(X + 3, Y + 2), 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 + 4, Y + 12), 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, (0, 0) - (14, 14), &hAAAAAA, B Line ButtIMG, (1, 1) - (13, 13), &hAAAAAA, B Line ButtIMG, (1, 1) - (12, 1), &h666666 Line ButtIMG, (1, 1) - (1, 12), &h666666 ButtIMG2 = Imagecreate(15, 15, &hFFFFFF, 32) Line ButtIMG2, (1, 1) - (13, 13), &h000000 Line ButtIMG2, (13, 1) - (1, 13), &h000000 Line ButtIMG2, (0, 0) - (14, 14), &hAAAAAA, B Line ButtIMG2, (1, 1) - (13, 13), &hAAAAAA, B Line ButtIMG2, (1, 1) - (12, 1), &h666666 Line ButtIMG2, (1, 1) - (1, 12), &h666666 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 RB X as Integer Y as Integer Active as Byte End Type Type RadioButton Private: RBPTR as RB PTR Counter as Integer CB As Sub(ID as String) RBID as String H as Byte Public: Active as Integer Declare Constructor(ID as String, Event as Sub(ID as String)) Declare Destructor() Declare Sub NewRadioButton(XPos as Integer, YPos as Integer) Declare Sub G() Declare Sub GClear() Declare Sub Control() Declare Sub Hide() Declare Sub Show() End Type '############################################################################### Constructor RadioButton(ID as String, Event as Sub(ID as String)) Active = -1 CB = Event RBID = ID RBPTR = Allocate(SizeOf(RB)) If RBPTR = 0 then CLS Print "[ERROR] Zero pointer exception in: Constructor RadioButton()" GetKey Sleep End -1 Endif End Constructor '############################################################################### Destructor RadioButton() DeAllocate(RBPTR) End Destructor '############################################################################### Sub RadioButton.NewRadioButton(XPos as Integer, YPos as Integer) RBPTR = ReAllocate(RBPTR, SizeOf(RB) * (Counter + 1)) RBPTR[Counter].X = XPos RBPTR[Counter].Y = YPos RBPTR[Counter].Active = 0 Counter += 1 End Sub '############################################################################### Sub RadioButton.G() If H = 0 then Dim as Integer a For a = 0 to Counter - 1 If RBPTR[a].Active = 0 then Circle(RBPTR[a].X + 5, RBPTR[a].Y + 5), 5, &h666666,,,, F Circle(RBPTR[a].X + 5, RBPTR[a].Y + 5), 3, &hFFFFFF,,,, F Else Circle(RBPTR[a].X + 5, RBPTR[a].Y + 5), 5, &h666666,,,, F Circle(RBPTR[a].X + 5, RBPTR[a].Y + 5), 3, &hFFFFFF,,,, F Circle(RBPTR[a].X + 5, RBPTR[a].Y + 5), 2, &h000000,,,, F Endif Next a Endif End Sub '############################################################################### Sub RadioButton.GClear() If H = 0 then Dim as Integer a For a = 0 to Counter - 1 Circle(RBPTR[a].X, RBPTR[a].Y), 10, &h000000,,,, F Next a Endif End Sub '############################################################################### Sub RadioButton.Control() If H = 0 then Dim as Integer a, b Dim as Integer MX, MY, MB GetMouse MX, MY,, MB For a = 0 to Counter - 1 If MX > RBPTR[a].X and MX < RBPTR[a].X + 10 and _ MY > RBPTR[a].Y and MY < RBPTR[a].Y + 10 and MB = 1 then For b = 0 to Counter - 1 RBPTR[b].Active = 0 Next b RBPTR[a].Active = 1 Active = a CB(RBID) Endif Next a Endif End Sub '############################################################################### Sub RadioButton.Hide() H = 1 End Sub '############################################################################### Sub RadioButton.Show() H = 0 End Sub '############################################################################### '############################################################################### '############################################################################### Type EList ID as String Text as String End Type '############################################################################### Type ElementList Private: X as Integer Y as Integer LText as String EWidth as Integer Elements as EList PTR Counter as Byte Active as Byte CB as Sub(ID as String) Public: Declare Constructor(XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) Declare Destructor() Declare Function NewElement(ElementText as String, ElementID as String) as Byte Declare Sub Control() Declare Sub G() Declare Sub GClear() End Type '############################################################################### Constructor ElementList(XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) X = XPos Y = YPos EWidth = Length CB = Event Elements = Allocate(SizeOf(EList) * 10) If Len(Text) > Length then CLS Print "[ERROR] in Constructor ElementList: Length of Text > Defined Lenght" GetKey Sleep End -1 Else LText = Text Endif End Constructor '############################################################################### Destructor ElementList() DeAllocate(Elements) End Destructor '############################################################################### Function ElementList.NewElement(ElementText as String, ElementID as String) as Byte If Counter < 10 then Elements[Counter].ID = ElementID If Len(ElementText) > EWidth then CLS Print "[ERROR] in Sub ElementList.NewElement: Length of Text > Defined Lenght" GetKey Sleep End -1 Else Elements[Counter].Text = ElementText Endif Counter += 1 Return Counter - 1 Else Return -1 Endif End Function '############################################################################### Sub ElementList.Control() Dim as Integer a Dim as Integer MX, MY, MB GetMouse MX, MY,, MB For a = 0 to 9 If MX > X And MX < X + EWidth * 8 + 6 And MY > Y + (a + 1) * 12 And MY < Y + (a + 1) * 12 + 12 And MB = 1 And Active = 1 then CB(Elements[a].ID) Endif Next a If MX > X and MX < X + EWidth * 8 + 6 and MY > Y and MY < Y + 12 then If MB = 1 then Active = 1 Else If MB = 1 and Active = 1 then GClear() : Active = 0 Endif End Sub '############################################################################### Sub ElementList.G() Dim a as Integer Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &hFFFFFF, BF Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 11) - (X + EWidth * 8 + 3, Y + 11), &h666666 Line(X + EWidth * 8 + 3, Y + 1) - (X + EWidth * 8 + 3, Y + 11), &h666666 Draw String(X + 2, Y + 2), LText, &h000000 If Active = 1 And Counter > 0 then For a = 0 to Counter - 1 Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &hFFFFFF, BF Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &hAAAAAA, B Draw String(X + 2, Y + 3 + (a + 1) * 12), Elements[a].Text, &h000000 Next a Endif End Sub '############################################################################### Sub ElementList.GClear() Dim as Integer a Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &h000000, BF If Active = 1 And Counter > 0 then For a = 0 to Counter - 1 Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &h000000, BF Next a Endif End Sub '############################################################################### '############################################################################### '############################################################################### Type DropDown Text as String Private: X as Integer Y as Integer EWidth as Integer Elements as EList PTR Counter as Byte Active as Byte Public: Declare Constructor(XPos as Integer, YPos as Integer, SText as String, Length as Integer) Declare Destructor() Declare Function NewElement(ElementText as String) as Byte Declare Sub Control() Declare Sub G() Declare Sub GClear() End Type '############################################################################### Constructor DropDown(XPos as Integer, YPos as Integer, SText as String, Length as Integer) X = XPos Y = YPos EWidth = Length Elements = Allocate(SizeOf(EList) * 10) If Len(Text) > Length then CLS Print "[ERROR] in Constructor DropDown: Length of Text > Defined Lenght" GetKey Sleep End -1 Else Text = SText Endif End Constructor '############################################################################### Destructor DropDown() DeAllocate(Elements) End Destructor '############################################################################### Function DropDown.NewElement(ElementText as String) as Byte If Counter < 10 then If Len(ElementText) > EWidth then CLS Print "[ERROR] in Function DropDown.NewElement: Length of Text > Defined Lenght" GetKey Sleep End -1 Else Elements[Counter].Text = ElementText Endif Counter += 1 Return Counter - 1 Else Return -1 Endif End Function '############################################################################### Sub DropDown.Control() Dim as Integer a Dim as Integer MX, MY, MB GetMouse MX, MY,, MB For a = 0 to 9 If MX > X And MX < X + EWidth * 8 + 6 And MY > Y + (a + 1) * 12 And MY < Y + (a + 1) * 12 + 12 And MB = 1 And Active = 1 then Text = Elements[a].Text Endif Next a If MX > X and MX < X + EWidth * 8 + 6 and MY > Y and MY < Y + 12 then If MB = 1 then Active = 1 Else If MB = 1 and Active = 1 then GClear() : Active = 0 Endif End Sub '############################################################################### Sub DropDown.G() Dim a as Integer Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &hFFFFFF, BF Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &hAAAAAA, B Line(X + 1, Y + 11) - (X + EWidth * 8 + 3, Y + 11), &h666666 Line(X + EWidth * 8 + 3, Y + 1) - (X + EWidth * 8 + 3, Y + 11), &h666666 Draw String(X + 2, Y + 2), Text, &h000000 If Active = 1 And Counter > 0 then For a = 0 to Counter - 1 Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &hFFFFFF, BF Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &hAAAAAA, B Draw String(X + 2, Y + 3 + (a + 1) * 12), Elements[a].Text, &h000000 Next a Endif End Sub '############################################################################### Sub DropDown.GClear() Dim as Integer a Line(X, Y) - (X + EWidth * 8 + 4, Y + 12), &h000000, BF If Active = 1 And Counter > 0 then For a = 0 to Counter - 1 Line(X, Y + (a + 1) * 12) - (X + EWidth * 8 + 4, Y + 12 + (a + 1) * 12), &h000000, BF Next a Endif End Sub '############################################################################### '############################################################################### '############################################################################### Type StrictTextArea Private: X as Integer Y as Integer TAWidth as Integer TAHeight as Integer Auswahl as Byte H as Byte Lines as Integer CurrLine as String LockField as Byte Public: Text as String MOver as Byte Declare Constructor(XPos as Integer, YPos as Integer, TWidth as Integer, THeight as Integer) Declare Sub Control() Declare Sub G() Declare Sub GClear() Declare Sub Hide() Declare Sub Show() Declare Sub SetText(Msg as String) Declare Sub LockElement() Declare Sub UnlockElement() End Type '############################################################################### Constructor StrictTextArea(XPos as Integer, YPos as Integer, TWidth as Integer, THeight as Integer) X = XPos Y = YPos TAWidth = TWidth TAHeight = THeight End Constructor '############################################################################### Sub StrictTextArea.Control() Dim as Integer MX, MY, MB Dim as String T Dim as Integer a If H = 0 then GetMouse(MX, MY,, MB) If MX > X and MX < X + TAWidth * 8 + 6 and MY > Y and MY < Y + TAHeight * 8 + 6 then If LockField = 0 then MOver = 1 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 MOver = 0 Endif Lines = 0 For a = 0 to LEN(Text) If Mid(Text, a, 1) = CHR(13) then Lines += 1 Next If LockField = 0 then 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(CurrLine) < TAWidth then Text += T ElseIf ASC(Mid(T, 1, 1)) = 13 then If Lines < TAHeight - 1 then Text += CHR(13) Endif Endif Endif Endif End Sub '############################################################################### Sub StrictTextArea.G() Dim as Integer a Dim as String Temp Dim as Integer CurrPos = -1, NextPos = -1 If H = 0 then If LockField = 0 then Line(X, Y) - (X + TAWidth * 8 + 6, Y + TAHeight * 8 + 6), &hFFFFFF, BF If LockField = 1 then Line(X, Y) - (X + TAWidth * 8 + 6, Y + TAHeight * 8 + 6), &hDDDDDD, BF Line(X, Y) - (X + TAWidth * 8 + 6, Y + TAHeight * 8 + 6), &hAAAAAA, B Line(X + 1, Y + 1) - (X + TAWidth * 8 + 5, Y + 1), &h666666 Line(X + 1, Y + 1) - (X + 1, Y + TAHeight * 8 + 5), &h666666 For a = 0 to Lines CurrPos = InSTR(CurrPos, Text, CHR(13)) + 1 NextPos = InSTR(CurrPos, Text, CHR(13)) If CurrPos < LEN(Text) + 1 then Temp = MID(Text, CurrPos, NextPos - CurrPos) Draw String(X + 5, Y + 5 + a * 8), Temp, &h000000 Else Exit For Endif Next a CurrLine = MID(Text, CurrPos, NextPos - CurrPos) Endif End Sub '############################################################################### Sub StrictTextArea.GClear() If H = 0 then Line(X, Y) - (X + TAWidth * 8 + 6, Y + TAHeight * 8 + 6), &h000000, BF Endif End Sub '############################################################################### Sub StrictTextArea.Hide() H = 1 End Sub '############################################################################### Sub StrictTextArea.Show() H = 0 End Sub '############################################################################### Sub StrictTextArea.SetText(Msg as String) Dim as Integer a Dim as Byte Check Text = "" While(Len(Msg) > TAWidth) For a = 1 to TAWidth Text += Mid(Msg, a, 1) If ASC(Mid(Msg, a, 1)) = 13 then Msg = Mid(Msg, a + 1) : Check = 1 Next a If Check = 0 then Text += CHR(13) : Msg = Mid(Msg, TAWidth + 1) Check = 0 Wend Text += Msg End Sub '############################################################################### Sub StrictTextArea.LockElement() LockField = 1 End Sub '############################################################################### Sub StrictTextArea.UnlockElement() LockField = 0 End Sub '############################################################################### '############################################################################### '############################################################################### Type Cursor Private: CursorPTR as Any PTR MX as Integer MY as Integer MXL as Integer MYL as Integer H as Byte Public: Declare Constructor() Declare Sub Control() Declare Sub G() Declare Sub GClear() Declare Sub Show() Declare Sub Hide() End Type '############################################################################### Constructor Cursor() CursorPTR = ImageCreate(5, 10, &hFF00FF, 32) Line CursorPTR, (0, 0) - (4, 0), &h000000 Line CursorPTR, (0, 9) - (4, 9), &h000000 Line CursorPTR, (2, 0) - (2, 9), &hFF00FF Line CursorPTR, (2, 1) - (2, 8), &h000000 If CursorPTR = 0 then CLS Print "[ERROR]Something went wrong in: Constructor Cursor()" Getkey Sleep End -1 Endif H = 1 End Constructor '############################################################################### Sub Cursor.Control() MXL = MX MYL = MY If H = 0 then GetMouse MX, MY End Sub '############################################################################### Sub Cursor.G() If H = 0 then Put(MX, MY), CursorPTR, ALPHA, 255 End Sub '############################################################################### Sub Cursor.GClear() Line(MXL, MYL) - (MXL + 5, MYL + 10), &h000000, BF End Sub '############################################################################### Sub Cursor.Hide() H = 1 SetMouse,, 1 End Sub '############################################################################### Sub Cursor.Show() H = 0 SetMouse,, 0 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 NewRadioButton(ID as String, Event as Sub(ID as String)) as Integer Declare Function NewElementList(XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) as Integer Declare Function NewStrictTextArea(X as Integer, Y as Integer, TextWidth as Integer, TextHeight as Integer) as Integer Declare Function NewDropDown(X as Integer, Y as Integer, Text as String, Length as Integer) 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 Function GetRadioButtonPTR(Nr as Integer) as RadioButton PTR Declare Function GetElementListPTR(Nr as Integer) as ElementList PTR Declare Function GetStrictTextAreaPTR(Nr as Integer) as StrictTextArea PTR Declare Function GetDropDownPTR(Nr as Integer) as DropDown PTR Declare Sub G() Declare Sub Control() Declare Sub GClear() Declare Sub CursorCheck() 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 RadioButton PTR PTR RadioArr As Integer RadioSize As ElementList PTR PTR EleArr As Integer EleSize As DropDown PTR PTR DropArr As Integer DropSize As StrictTextArea PTR PTR STAreaArr As Integer STAreaSize As Byte Threadstop As TimeControlUDT FPS = TimeControlUDT(60) As Cursor C = Cursor() 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)) RadioArr = Allocate(SizeOf(RadioButton PTR)) EleArr = Allocate(SizeOf(ElementList PTR)) DropArr = Allocate(SizeOf(DropDown PTR)) STAreaArr = Allocate(SizeOf(StrictTextArea PTR)) If LabelArr = 0 OR CheckArr = 0 OR TextFieldArr = 0 OR _ RollTextFieldArr = 0 OR PWTextFieldArr = 0 OR ButtonArr = 0 OR _ RadioArr = 0 OR EleArr = 0 OR STAreaArr = 0 OR DropArr = 0 Then CLS Print "[ERROR] Zero pointer exception in Constructor GUI()" GetKey() Sleep 500, 1 End -1 Endif End Constructor '############################################################################### Destructor GUI DeAllocate(LabelArr) DeAllocate(CheckArr) DeAllocate(TextFieldArr) DeAllocate(RollTextFieldArr) DeAllocate(PWTextFieldArr) DeAllocate(ButtonArr) DeAllocate(RadioArr) DeAllocate(EleArr) DeAllocate(DropArr) DeAllocate(STAreaArr) 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.NewRadioButton(ID as String, Event as Sub(ID as String)) as Integer RadioArr[RadioSize] = New RadioButton(ID, Event) RadioSize += 1 RadioArr = ReAllocate(RadioArr, SizeOf(RadioButton PTR) * (RadioSize + 1)) Return RadioSize End Function '############################################################################### Function GUI.NewElementList(XPos as Integer, YPos as Integer, Text as String, Length as Integer, Event as Sub(ID as String)) as Integer EleArr[EleSize] = New ElementList(XPos, YPos, Text, Length, Event) EleSize += 1 EleArr = ReAllocate(EleArr, SizeOf(ElementList PTR) * (EleSize + 1)) Return EleSize End Function '############################################################################### Function GUI.NewDropDown(X as Integer, Y as Integer, Text as String, Length as Integer) as Integer DropArr[DropSize] = New DropDown(X, Y, Text, Length) DropSize += 1 DropArr = ReAllocate(DropArr, SizeOf(DropDown PTR) * (DropSize + 1)) Return DropSize End Function '############################################################################### Function GUI.NewStrictTextArea(X as Integer, Y as Integer, TextWidth as Integer, TextHeight as Integer) as Integer STAreaArr[STAreaSize] = New StrictTextArea(X, Y, TextWidth, TextHeight) STAreaSize += 1 STAreaArr = ReAllocate(STAreaArr, SizeOf(StrictTextArea PTR) * (STAreaSize + 1)) Return STAreaSize 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 '############################################################################### Function GUI.GetRadioButtonPTR(Nr as Integer) as RadioButton PTR If Nr < 1 Or Nr > RadioSize then Return 0 Else Return RadioArr[Nr - 1] End Function '############################################################################### Function GUI.GetElementListPTR(Nr as Integer) as ElementList PTR If Nr < 1 Or Nr > EleSize then Return 0 Else Return EleArr[Nr - 1] End Function '############################################################################### Function GUI.GetDropDownPTR(Nr as Integer) as DropDown PTR If Nr < 1 Or Nr > DropSize then Return 0 Else Return DropArr[Nr - 1] End Function '############################################################################### Function GUI.GetStrictTextAreaPTR(Nr as Integer) as StrictTextArea PTR If Nr < 1 Or Nr > STAreaSize then Return 0 Else Return STAreaArr[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 If RadioSize > 0 then For a = 0 to RadioSize - 1 RadioArr[a]->G() Next a Endif If EleSize > 0 then For a = 0 to EleSize - 1 EleArr[a]->G() Next a Endif If DropSize > 0 then For a = 0 to DropSize -1 DropArr[a]->G() Next a Endif If STAreaSize > 0 then For a = 0 to STAreaSize - 1 STAreaArr[a]->G() Next a Endif C.G() 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 If RadioSize > 0 then For a = 0 to RadioSize - 1 RadioArr[a]->Control() Next a Endif If EleSize > 0 then For a = 0 to EleSize - 1 EleArr[a]->Control() Next a Endif If DropSize > 0 then For a = 0 to DropSize -1 DropArr[a]->Control() Next a Endif If STAreaSize > 0 then For a = 0 to STAreaSize - 1 STAreaArr[a]->Control() Next a Endif CursorCheck() C.Control() 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 If RadioSize > 0 then For a = 0 to RadioSize - 1 RadioArr[a]->GClear() Next a Endif If EleSize > 0 then For a = 0 to EleSize - 1 EleArr[a]->GClear() Next a Endif If DropSize > 0 then For a = 0 to DropSize -1 DropArr[a]->GClear() Next a Endif If STAreaSize > 0 then For a = 0 to STAreaSize - 1 STAreaArr[a]->GClear() Next a Endif C.GClear() 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 '############################################################################### Sub GUI.CursorCheck() Dim as Byte Check Dim as Integer a If TextFieldSize > 0 then For a = 0 to TextFieldSize - 1 If TextFieldArr[a]->MOver = 1 then Check = 1 Next a Endif If RollTextFieldSize > 0 then For a = 0 to RollTextFieldSize - 1 If RollTextFieldArr[a]->MOver = 1 then Check = 1 Next a Endif If PWTextFieldSize > 0 then For a = 0 to PWTextFieldSize - 1 If PWTextFieldArr[a]->MOver = 1 then Check = 1 Next a Endif If STAreaSize > 0 then For a = 0 to STAreaSize - 1 If STAreaArr[a]->MOver = 1 then Check = 1 Next a Endif If Check > 0 then C.Show() Else C.Hide() Endif End Sub '############################################################################### '############################################################################### '############################################################################### Sub DEGUIErrOutEv(ID as String) If ID = "end" then End 0 End Sub '############################################################################### Sub DEGUIErrOut(Parameter as Integer = 1) If Command(Parameter) = "ERROR" then ScreenRes 640, 480, 24 Color &hFFFFFF, &hAAAAAA CLS Dim as GUI G Dim as TextField PTR Kw Dim as StrictTextArea PTR TA Kw = G.GetTextFieldPTR(G.NewTextField(10, 10, 76, Command(Parameter + 1))) Kw->LockElement() TA = G.GetStrictTextAreaPTR(G.NewStrictTextArea(10, 40, 76, 50)) TA->SetText(Command(Parameter + 2)) TA->LockElement() G.NewButton(" OK ", 304, 455, "end", @DEGUIErrOutEv) While(NOT Multikey(&h01)) G.Control() ScreenLock CLS G.G() ScreenUnlock Sleep 10 Wend End 0 Endif End Sub '############################################################################### Sub DEGUIError(Title as String, ErrorMsg as String, Parameter as Integer = 1) Dim Versatz as String Dim as Integer a For a = 1 to Parameter - 1 Versatz += "- " Next a Exec(Command(0), Versatz & "ERROR" & " " & Title & " " & CHR(34) & ErrorMsg & CHR(34)) End Sub '############################################################################### '############################################################################### '###############################################################################