GUI - Wie realisiert man Button Events? *Gelöst*

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: GUI - Wie realisiert man Button Events? *Gelöst*

BeitragSa, Jan 14, 2012 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich bin momentan dabei, eine eigene GUI zu programmieren. Ich weiß dass es viele GUI´s zur Auswahl gibt, es geht mir aber mehr um das Konzept wie man so etwas realisiert weil ich es selber auch können möchte Very Happy
Ich bin eigentlich schon ziemlich zufrieden, ich kann jetzt Fenster und Buttons und Labels erstellen lassen, das ist alles kein Problem und war fand ich auch nich soo schwer Wink Jedoch hab ich so ein wenig bedenken, wie ich im Hauptprogramm möglichst ohne viel Code zu bestimmen was passieren soll wenn ich einen bestimmten button drücke... Also ich will eigentlich nicht eine ganze Funktion mit ins Hauptprogramm mit reinsetzen und dort überprüfen:

BlitzBasic: [AUSKLAPPEN]

Select b\ID

Case "Btn_Test01"
Exit

End Select


Ich würds gerne so machen, dass ich in der hauptschleife ne Funktion laufen lasse, welche eine variable bekommt, z.B. so:
BlitzBasic: [AUSKLAPPEN]

Btn_Test01 = UpdateButton("Btn_Test01")
If Btn_Test01 = 1 Then ;Wenn mir der Button eine 1 liefert also wenn er gedrückt wurde

End ;programm beenden zum Beispiel Wink

End If


ich würd das gerne so machen Very Happy Mein Problem dabei ist aber, das wenn ich dann bei einem anderen button auch ne 1 zurück bekomme, wird immer "End" ausgeführt obwohl es überhaupt nich zu dem Button gehört -.-

Hier mal meine Dokumente:

GUI.bb
BlitzBasic: [AUSKLAPPEN]

;###GUI by GearTechDE###;

;######;
;ButtonGUI;

Function CreateButton(ID$,BtnText$,Target$,PosX#,PosY#,ScaleX#,ScaleY#)

b.Button = New Button
b\ID = ID
b\Target = Target
b\BtnText = BtnText
b\PosX = PosX
b\PosY = PosY
b\ScaleX = ScaleX
b\ScaleY = ScaleY
b\Marked = 0
b\Active = 1

End Function

Function UpdateButton(ID$)

For w.Window = Each Window
For b.Button = Each Button

If w\ID = b\Target Then

If w\Active = 1 Then

b\Active = 1

Else

b\Active = 0

End If

End If

If b\Active = 1 Then

;Gerüst
Color 127,127,127
Rect b\PosX,b\PosY,b\ScaleX,b\ScaleY,1
Color 255,255,255

;Rand
Color 0,0,0
Rect b\PosX -1,b\PosY -1,b\ScaleX +1,b\ScaleY +1,0
Color 255,255,255

;Beschriftung
Color 0,0,0
Text b\PosX + 3,b\PosY + 2,b\BtnText
Color 255,255,255

;Abfrage für Maus
If MouseX() > b\PosX And MouseX() < b\PosX + b\ScaleX And MouseY() > b\PosY And MouseY() < b\PosY + b\ScaleY Then

Color 255,255,255
Rect b\PosX -1,b\PosY -1,b\ScaleX +1,b\ScaleY +1,0
Color 255,255,255

If MouseHit(1) Then

Return b\ID

End If

End If

End If

Next
Next

End Function

Type Button

Field ID$,Target$
Field BtnText$
Field PosX#,PosY#,ScaleX#,ScaleY#
Field Marked%,Active%

End Type

;ButtonGUI;
;######;



;######;
;WindowGUI;

Global img_normal = LoadImage(".\resources\img_normal.png")
MaskImage img_normal,255,0,255
HidePointer()

Function CreateWindow(ID$,Title$,StartX%,StartY%,SizeX%,SizeY%,Active%)

w.Window = New Window
w\ID = ID
w\Title = Title
w\SizeX = SizeX
w\SizeY = SizeY
w\X = StartX
w\Y = StartY
w\Active = Active

End Function

Function UpdateWindow(ID$)

For w.Window = Each Window

If w\ID = ID Then

If w\Active = 1 Then

;Zeichne Fenster
Color 150,150,150
Rect w\X,w\Y,w\SizeX,w\SizeY +24,1
Color 255,255,255

;Zeichne UserControlBar
Color 50,50,50
Rect w\X,w\Y,w\SizeX,24,1
Color 255,255,255

Color 255,255,255
Text w\X +5,w\Y +5,w\Title
Color 255,255,255

;Zeichne Rand
Color 0,0,0
Rect w\X,w\Y,w\SizeX,w\SizeY +24,0
Color 255,255,255

;Zeichne X
Color 200,200,200
Rect w\X + w\SizeX - 23,w\Y + 1,22,22
Color 255,255,255
Color 0,0,0
Text w\X + w\SizeX - 16,w\Y + 5,"X"
Color 255,255,255

;Check Click X
If MouseX() > w\X + w\SizeX - 23 And MouseX() < w\X + w\SizeX And MouseY() > w\Y And MouseY() < w\Y + 22 Then

;Draw Overlay
Color 127,127,127
Rect w\X + w\SizeX - 23,w\Y + 1,22,22
Color 255,255,255
Color 0,0,0
Text w\X + w\SizeX - 16,w\Y + 5,"X"
Color 255,255,255

If MouseDown(1) Then

w\Active = 0 ;Deactivate Window

End If

End If

Else

Return "InActive"

End If

End If

Next

End Function

Function UpdateGUI()

;Zeichne Zeiger
DrawImage img_normal,MouseX() -4,MouseY() -1


End Function

Type Window

Field ID$,Title$
Field SizeX%,SizeY%,X%,Y%
Field Active%

End Type
;WindowGUI;
;######;



;######;
;LabelGUI;

Function CreateLabel(ID$,Name$,X%,Y%)

lb.Label = New Label
lb\ID = ID
lb\Name = Name
lb\X = X
lb\Y = Y

End Function

Function UpdateLabel(ID$)

For lb.Label = Each Label

If lb\ID = ID Then

Text lb\X,lb\Y,lb\Name

End If

Next

End Function

Type Label

Field ID$
Field Name$
Field X%,Y%

End Type

;LabelGUI
;######;


und hier das testdokument:
BlitzBasic: [AUSKLAPPEN]

AppTitle "Window GUI Test"
Graphics 800,600,32,2
SetBuffer BackBuffer()

Global Btn_Exit,Btn_StartNotepad

Include "GUI.bb"

CreateWindow("W_Test01","[GearTech] GUI Sample",5,5,790,565,1)
CreateButton("Btn_Exit","Beenden","W_Test01",720,565,66,18)
CreateButton("Btn_StartNotepad","Notepad Starten","W_Test01",15,565,130,18)

ClsColor 0,126,127

Repeat
Cls

UpdateWindow("W_Test01")
Btn_Exit = UpdateButton("Btn_Exit")
Btn_StartNotepad = UpdateButton("Btn_StartNotepad")

UpdateGUI()
UpdateButtons()

Flip
Until KeyHit(1)
End

Function UpdateButtons()

FlushMouse()
If Btn_Exit = "Btn_Exit" Then End

End Function


Hier das image:
user posted image
Mit freundlichen Grüßen: GearTechDE
  • Zuletzt bearbeitet von GearTechDE am So, Jan 15, 2012 13:32, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Jan 14, 2012 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde es etwa so machen:
Code: [AUSKLAPPEN]
Local Button1.TButton = CreateButton(...)
;[...]
UpdateGUI()
If Button1\Pressed Then ...

UpdateGUI() sorgt dafür, dass die Knöpfe auf dem laufenden sind und die lassen sich einfach abfragen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Freak123

BeitragSa, Jan 14, 2012 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
MouseHit(1) zwischenspeichern
Code: [AUSKLAPPEN]
mh1=MouseHit(1)


und dann:

Code: [AUSKLAPPEN]
If mh1 Then


lg

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jan 14, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey, also ich werd mich da nochmal dransetzen. Danke :=)
Mit freundlichen Grüßen: GearTechDE

Addi

BeitragSa, Jan 14, 2012 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest auch eine Funktion schreiben, welche alle Types durchgeht und schaut ob ein Button gecklickt wurde und diesen wieder auf Null setzen und mit Return True zurück geben:

Function ButtonState( ID )
B.Button=Object.Button(ID)
If B\Clicked=True then
B\Clicked=Null
Return True
End If
End Function

Und abfragen könnte man das das so:

If ButtonState(TestButton)=1 then
...
End If

Man kan diese Funktion dann auch noch so umbauen das sie auch noch zurückgiebt wen die Maus über dem Button ist oder der Button gedrückt ist

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jan 14, 2012 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch ne Möglichkeit, danke, werd mal probieren Wink
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragSo, Jan 15, 2012 3:04
Antworten mit Zitat
Benutzer-Profile anzeigen
also wie ich deine Code sehe, hast Du deshalb das Problem, weil Du zwar in der UpdateButton()-Funktion einen Paramater übergibts, der die Funktion auf einen bestimmten Button aufmerksam machen soll. In der Funktion dann wertest Du dies bei den Maus-Checks aber gar nicht aus, sondern gehst alle Buttons durch. Wenn nun irgendeiner dieser Button geklickt wird gibt es egalt welcher UpdateButton()-Aufruf gerade erfolgt, immer diesen Button zurück.

Beispiel:

Du klickst auf den "Btn_StartNotepad"-Button

in der Hauptschleife kommt aber zuerst dieser Funktionsaufruf...
BlitzBasic: [AUSKLAPPEN]
Btn_Exit = UpdateButton("Btn_Exit")

...dran und die liefert nun einen Wert <>0 zurück
das reicht, um hier...
BlitzBasic: [AUSKLAPPEN]
	If Btn_Exit = "Btn_Exit" Then End
..das Progrsmm zu beenden.

Es braucht nur eine kleine Änderung, dann läuft es:

BlitzBasic: [AUSKLAPPEN]
...
;Abfrage für Maus
If MouseX() > b\PosX And MouseX() < b\PosX + b\ScaleX And MouseY() > b\PosY And MouseY() < b\PosY + b\ScaleY Then

Color 255,255,255
Rect b\PosX -1,b\PosY -1,b\ScaleX +1,b\ScaleY +1,0
Color 255,255,255

If MouseHit(1) Then
; hier---------------------------->
If b\ID=ID Then Return b\ID
End If
...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Addi

BeitragSo, Jan 15, 2012 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry hab ausversehn B\Clicked=Null geschrieben meinte eig:
B\Clicked=False

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Jan 15, 2012 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Leute, habs vor genau 2 Minuten geschafft und so gemacht:

Noch eine weitere Funktion dazu:

BlitzBasic: [AUSKLAPPEN]

Function ButtonDown(ID$)

For b.Button = Each Button

If b\ID = ID Then

If MouseHit(1) Then

;HIER NOCH NE Mausabfrage, ob maus über button ist

Return True ;true ausliefern

End If

End If

Next

End Function


Jetzt kann ich ganz einfach überprüfen:
BlitzBasic: [AUSKLAPPEN]

If ButtonDown("btn_exit") = 1 Then End


Funktioniert Super, Danke Smile
Mit freundlichen Grüßen: GearTechDE

Eingeproggt

BeitragSo, Jan 15, 2012 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaub nicht dass das super funktioniert, weil:
Freak123 hat Folgendes geschrieben:
MouseHit(1) zwischenspeichern
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

GearTechDE

ehemals 'KillerJo96'

BeitragSo, Jan 15, 2012 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert aber alles super wie ich finde??
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSo, Jan 15, 2012 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nichts 3D spezifisches, also:
~VERSCHOBEN~

Ist doch toll wenn alles funktioniert.
Ich hoffe bloß, du liest den FAQ bevor du mit der am meisten gefragten Frage ankommst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Jan 16, 2012 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre dann genau wie Freak123 das erklärt hat. Eigentlich hatte ich kein Problem, jedoch habe ich es nicht danach wo ich es geschafft habe mit mehreren buttons versucht. Ivh werde morgen nochmal überprüfen ob es jetzt klappt oder nicht. Danke aber für den Hinweis Wink
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group