GUI Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Mathe

Betreff: GUI Problem

BeitragDo, Dez 25, 2008 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hab gestern angefangen eine kleine GUI zu programmieren leider funktioniert das Fenster verschrieben beim Fenster:
- TestWindow
- lol
nicht wirklich aber das Fenster Optionen lässt sich normal verschieben...
kann mir jemand helfen?

Hier der GUI Code:
Code: [AUSKLAPPEN]
Type Button
   Field Btn_String$
   Field Btn_X%, Btn_Y%
   Field Btn_Width%, Btn_Height%
   Field Btn_Group%
   Field Btn_Color_disable$, Btn_Color_enable$
End Type


Type Window
   Field Win_String$
   Field Win_X%, Win_Y%
   Field Win_Width%, Win_Height%
   Field Win_Move%, Win_disX%, Win_disY%
   Field Win_ID%
   Field Win_Color_disable$, Win_Color_enable$
End Type

Function ButtonState(Button$) ; Button Name
   For btn.Button = Each Button
      If String_Btn$ = Button$ Then Return Btn_State%
   Next
Return
End Function

Function CreateButton(btn_Text$, x%, y%, breite%, hoehe%, gruppe%)
btn.Button = New Button
   btn.Button\Btn_String = btn_Text
   btn.Button\Btn_X = x
   btn.Button\Btn_Y = Y
   btn.Button\Btn_Width = breite
   btn.Button\Btn_Height = hoehe
   btn.Button\Btn_Group = gruppe
   btn.Button\Btn_Color_disable = "255,255,255"
   btn.Button\Btn_Color_enable = "255,255,255"
Return Handle (btn.Button)
End Function

Function UpdateButton()
SaveColorBlue = ColorBlue
SaveColorGreen = ColorGreen
SaveColorRed = ColorRed
For btn.Button = Each Button
   If Rectsoverlap(btn.Button\Btn_X, btn.Button\Btn_Y, btn.Button\Btn_Width, btn.Button\Btn_Height, MouseX(), MouseY(), 1,1) Then
      ;Farbe auswerten enable
      point1% = Instr(btn.Button\Btn_Color_enable, ",")
      point2% = Instr(btn.Button\Btn_Color_enable, ",",point1+1)
      ColorB = Mid(btn.Button\Btn_Color_enable, 1, point1-1)
      ColorG = Mid(btn.Button\Btn_Color_enable, point+1, point2-1)
      ColorR = Mid(btn.Button\Btn_Color_enable, point2+1, -1)
   Else
      ;Farbe auswerten disable
      point1% = Instr(btn.Button\Btn_Color_disable, ",")
      point2% = Instr(btn.Button\Btn_Color_disable, ",",point1+1)
      ColorB = Mid(btn.Button\Btn_Color_disable, 1, point1-1)
      ColorG = Mid(btn.Button\Btn_Color_disable, point+1, point2-1)
      ColorR = Mid(btn.Button\Btn_Color_disable, point2+1, -1)
   EndIf
   
   ;Win_Move bei Buttons verarbeiten..
   For Win.Window = Each Window
   If Win.Window\Win_Move = 1 And btn.Button\Btn_Group = Win.Window\Win_ID Then
      btn.Button\Btn_X = btn.Button\Btn_X + Win.Window\Win_disX
      btn.Button\Btn_Y = btn.Button\Btn_Y + Win.Window\Win_disY
   EndIf
   Next
   
   ;Button zeichnen
   Color ColorB,ColorG,ColorR
   Rect btn.Button\Btn_X, btn.Button\Btn_Y, btn.Button\Btn_Width, btn.Button\Btn_Height, 0
   Text btn.Button\Btn_X + btn.Button\Btn_Width/2, btn.Button\Btn_Y + btn.Button\Btn_Height/2, btn.Button\Btn_String, 1,1
Next
Color SaveColorBlue, SaveColorGreen, SaveColorRed
End Function

Function SetButtonColor(ID%, rgb_disable$, rgb_enable$)
btn.Button = Object.Button(ID)
btn.Button\Btn_Color_disable = rgb_disable
btn.Button\Btn_Color_enable = rgb_enable
End Function

Function HitButton(ID%)
btn.Button = Object.Button(ID)
If MouseX() <= btn.Button\Btn_X + btn.Button\Btn_Width And MouseX() >= btn.Button\Btn_X And MouseY() <= btn.Button\Btn_Y + btn.Button\Btn_Height And MouseY() >= btn.Button\Btn_Y And MouseDown(1) Then
   Return True
Else
   Return False
EndIf
End Function

Function CreateWindow(Name$, x%,Y%, breite%,hoehe%)
Win.Window = New Window
   Win.Window\Win_String = Name
   Win.Window\Win_X = x
   Win.Window\Win_Y = y
   Win.Window\Win_Width = breite
   Win.Window\Win_Height = hoehe
   Win.Window\Win_Color_disable = "255,255,255"
   Win.Window\Win_Color_enable = "255,255,255"
   Win.Window\Win_ID = Handle (Win.Window)
Return Handle (Win.Window)
End Function

Function SetWindowColor(ID%, Color_disable$, Color_enable$)
Win.Window = Object.Window(ID)
Win.Window\Win_Color_disable = Color_disable
Win.Window\Win_Color_enable = Color_enable
End Function

Function UpdateWindow()
SaveColorBlue = ColorBlue
SaveColorGreen = ColorGreen
SavecolorRed = ColorRed
For Win.Window = Each Window
   If RectsOverlap(Win.Window\Win_X, Win.Window\Win_Y, Win.Window\Win_Width, Win.Window\Win_Height, MouseX(), MouseY(), 1,1) Then
      ;Farbe auswerten enable
      point1% = Instr(Win.Window\Win_Color_enable, ",")
      point2% = Instr(Win.Window\Win_Color_enable, ",",point1+1)
      ColorB = Mid(Win.Window\Win_Color_enable, 1, point1-1)
      ColorG = Mid(Win.Window\Win_Color_enable, point+1, point2-1)
      ColorR = Mid(Win.Window\Win_Color_enable, point2+1, -1)
   Else
      ;Farbe auswerten disable
      point1% = Instr(Win.Window\Win_Color_disable, ",")
      point2% = Instr(Win.Window\Win_Color_disable, ",",point1+1)
      ColorB = Mid(Win.Window\Win_Color_disable, 1, point1-1)
      ColorG = Mid(Win.Window\Win_Color_disable, point+1, point2-1)
      ColorR = Mid(Win.Window\Win_Color_disable, point2+1, -1)
   EndIf
   ;Fenster zeichnen
   Color ColorB,ColorG,ColorR
   Rect Win.Window\Win_X, Win.Window\Win_Y, Win.Window\Win_Width, Win.Window\Win_Height, 0
   Rect Win.Window\Win_X, Win.Window\Win_Y, Win.Window\Win_Width, StringHeight(Win.Window\Win_String) + 6 , 0
   
   ;Fenster schließen
   closeX = Win.Window\Win_X + Win.Window\Win_Width - 3 - StringHeight(Win.Window\Win_String)
   closeY = Win.Window\Win_Y + 3
   closeWH = StringHeight(Win.Window\Win_String)
   Rect closeX, closeY, closeWH, closeWH,0
   Line closeX, CloseY, closeX + closeWH -1, closeY + closeWH -1
   Line closeX, closeY + closeWH -1, closeX + closeWH -1, closeY
   
   ;Fenster Minimieren
   minX = Win.Window\Win_X + Win.Window\Win_Width - 3 - StringHeight(Win.Window\Win_String) - 5 - closeWH
   minY = Win.Window\Win_Y + 3
   minWH = closeWH
   Rect minX, minY, minWH, minWH,0
   Rect minX+2, minY+5, minWH-4 ,minWH-8,0
   
   ;Fenster beschriften
   Text Win.Window\Win_X +3, Win.Window\Win_Y + StringHeight(Win.Window\Win_String)/2 +3, Win.Window\Win_String ,0,1
   
   ;Fenster bewegen
   Win.Window\Win_disX = MouseXspeed()
   Win.Window\Win_disY = MouseYspeed()
   If MouseDown(1) And RectsOverlap (Win.Window\Win_X, Win.Window\Win_Y, Win.Window\Win_Width, Win.Window\Win_Height, MouseX(), MouseY(), 1, 1)   Then
      Win.Window\Win_Move = 1
      Win.Window\Win_X = Win.Window\Win_X + Win.Window\Win_disX
      Win.Window\Win_Y = Win.Window\Win_Y + Win.Window\Win_disY
   Else
      Win.Window\Win_Move = 0
   EndIf
Next
Color SaveColorBlue, SaveColorGreen, SaveColorRed
End Function



Hier die Befehle die die GUI aufrufen:
Code: [AUSKLAPPEN]

Graphics 1024,768,32,2
SetBuffer BackBuffer()
win1 = CreateWindow("Optionen", 400,300,300,400)
win2 = CreateWindow("TestWindows", 0,0,300,400)
win3 = CreateWindow("lol ;)", 500,200,100,200)
button1 = CreateButton("Spieler", 450,350,100,25,win1)
button2 = CreateButton("Grafik", 450,400,100,25, win1)
button3 = CreateButton("Sounds", 450,450,100,25, win1)
button4 = CreateButton("Ende", 450,500,100,25, win1)
button5 = CreateButton("TestButton", 100,50, 100,25, win2)
SetButtonColor(button1,"123,123,123","210,250,220")
SetButtonColor(button5,"0,50,42","123,45,235")
SetWindowColor(win1,"123,235,12","120,120,80")

Repeat
   Cls
   Color 250,10,50
   Text 0,0, "Hallo"
   If HitButton(button4) = 1 Then End
   If HitButton(button1) = 1 Then Text 1024/2, 768/2, "Huhu es geht! ;)" ,1,1
   UpdateButton()
   UpdateWindow()
   Flip 1
Until KeyHit(1)


Edit:

Hier die Exe...

mfg.
  • Zuletzt bearbeitet von Mathe am Do, Dez 25, 2008 13:07, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDo, Dez 25, 2008 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
MouseXSpeed und MouseYSpeed werden nach jedem Aufruf genullt wenn ich nicht irre. Speicher die einmal pro Update in Variablen zwischen und es sollte gehen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragDo, Dez 25, 2008 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
nein MouseXSpeed und MouseYSpeed werden in ein Typefeld gespeicher...

Win.Window\Win_disX = MouseXSpeed
Win.Window\Win_disY = MouseYSpeed

Edit:
Hab jetzt rausgefunden warum sich die Fenster nicht richtig bewegen versteh ich nur nicht ganz...
Das Fenster das verschoben wird muss an erster stelle des Types verschoben werden! Nur ich versteh nicht ganz warum, aber es funktioniert.... Sad

Insert Win Before First Window
  • Zuletzt bearbeitet von Mathe am Do, Dez 25, 2008 19:07, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDo, Dez 25, 2008 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Es liegt an Mousex/yspeed, denn du speicherst das für jede Instanz und für jede Instanz ausser der ersten ist es natürlich null, wie ich oben schon schrieb. Speicher das Ergebnis der beiden Funktionen in typeunabhängige Variablen und es geht ohne dass du die Typeorder ändern musst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragDo, Dez 25, 2008 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm okey... danke...

hab jetzt das mit der Global Variable ausprobiert funktioniert aber auch nicht.. das gleiche Problem wie davor... jetzt versteh ich nur noch Bahnhof Embarassed

BladeRunner

Moderator

BeitragDo, Dez 25, 2008 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Code ist da nix los, aber ich tippe mal blind darauf dass Du die globale Variable immer noch innerhalb der Typeschleife zuweist und sie deshalb bei der 2en Instanz 0 ist.
Richtig wäre:
Code: [AUSKLAPPEN]
Function UpdateWindow(...)
    xdist = mousexspeed()
    ydist=mouseyspeed()
    for win.window = each window
        bla
        blub
    next
   ...


Und noch besser wäre es in der Tat diese Distanzen ganz global zu speichern damit sie überall im Programm zur Verfügung stehen. Wenn Du eh ne GUI machst wäre ein Type der solche Werte speichert und der einmal pro Frame ein Update erfährt eine Möglichkeit:

Code: [AUSKLAPPEN]
Type TInputManager
    field mh
    field x_dist, y_dist
etc etc...

global INPUTManager.TINPUTMANAGER = new TINPUTMANAGER


Function update_INPUT()
    inputmanager\mh = mousehit(1)
    inputmanager\x_dist = ...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Mathe

BeitragFr, Dez 26, 2008 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ohhh ähm ja... Embarassed

habs jetzt verstanden und richtig geändert.... und siehe da es funktioniert...

danke

Noch was:

wenn ich jetzt nach einen Type Object suche mit:

bbb.bbb = Object.bbb(ID%)
Return bbb.bbb\bbb_Leben

ist das nicht genau das gleiche wie:

For bbb.bbb = Each bbb
If bbb.bbb\bbb_ID = ID then Return bbb.bbb\bbb_Leben
Next

oder ist das eigenständige suchen langsamer?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group