Fenster GUI

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Fenster GUI

BeitragMi, Sep 16, 2009 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
habe 2 fenster mir gebastellt, es soll aber immer nur ein fenster aktiv sein, das is es auch, aber wenn man in der mitte der beiden fenster klickt, wechseln die sich ab, dabei soll es z.b. so sein wie in windows, wenn ich da ein fenster übers andere schieb passiert das ja auch nicht, seht selbst hier


Code: [AUSKLAPPEN]

Global WindowList:TList = New TList
Global Window:TWindow
Type TWindow
   Field Mode:Int
   Field Name:String
   Field X:Int
   Field Y:Int
   Field Width:Int
   Field Height:Int
   Field WID:String
         
   Function Create(Name:String, x:Int, y:Int, width:Int, height:Int, wid:String)
      Window:TWindow = New TWindow
      Window.name = name
      Window.x = X
      Window.y = Y
      Window.Width = Width
      Window.Height = Height
      Window.WID = wid
     
      WindowList.Addlast Window
   End Function
EndType

Function DrawWindow()
   For Window:TWindow = EachIn WindowList
      If Window.Mode = 0 Then
         SetAlpha 0.4
         SetBlend ALPHABLEND
      End If
      SetColor 255,255,0
      DrawRect Window.X , Window.Y , Window.Width , Window.Height
      SetColor 255, 255, 255

      SetColor WindowTitelR, WindowTitelG, WindowTitelB
      DrawText Window.Name, Window.X + 7, Window.Y + 4
      If Window.Mode = 0 Then
         SetAlpha 1
         SetBlend MASKBLEND
      End If

      If MouseDown(1) And MouseX() > Window.X And MouseX() < Window.X + Window.Width And MouseY() > Window.Y And MouseY() < Window.Y + Window.Height And UnderWindow(Window.WID, Window.X, Window.Y, Window.Width, Window.Height) = 1 Then
      If Window.mode = 1 Then
         For Window:TWindow = EachIn WindowList
            Window.mode = 0
         Next
        EndIf

      If Window.mode = 0 Then
            WindowList.Remove Window
            WindowList.AddLast Window
            Window.mode = 1
         End If

      End If
   Next
End Function

Function UnderWindow(WindowWID:String, x, y, w, h)
   For Window:TWindow = EachIn WindowList
      If Window.WID = WindowWID Then
         If MouseX() > Window.X And MouseX() < Window.X + Window.Width And MouseY() > Window.Y And MouseY() < Window.Y + Window.Height Then     
            Return 1
         EndIf
      EndIf
   Next
   Return 0
End Function


Function StartGUI()
   DrawWindow()
End Function




Graphics 1024, 768

TWindow.Create("Testfenster 0", 50, 50, 200, 180, "Cyber")
TWindow.Create("Testfenster 1", 80, 80, 200, 180, "Cyber1")
Repeat
   Cls
   StartGUI() 
   Flip
Until KeyDown(KEY_ESCAPE)
End

DaysShadow

BeitragMi, Sep 16, 2009 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte es so gelöst, dass ich noch eine Variable hatte, die immer die ID(welche auch immer den Platz im Array der Fenster darstellte) des "höchsten" Fensters beinhaltete und am Ende des Updates und Zeichnens der Fenster wurde dann das Fenster mit der ID in der Variable an die letzte Position des Arrays verschoben, somit wird es halt als letztes gezeichnet.
Es wird halt nicht sofort das Fenster als das aktive gesetzt, sondern nur das was in der Variable steht und das ist halt immer das obenliegende das angeklickt wird, weil das oberste immer die ID's in der Variable mit seiner eigenen ID überschreibt, weil als letztes im Array steht...schwer zu erklären das ganze =/

Wenn du etwas nicht verstanden hast, frag einfach nochmal..^^

MfG DaysShadow
Blessed is the mind too small for doubt

Mathias-Kwiatkowski

BeitragMi, Sep 16, 2009 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh kannst du es in meinem code einbaun und posten, habs bislang noch nich hinbekomm, leider

wäre echt nett von dir

DaysShadow

BeitragMi, Sep 16, 2009 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SuperStrict 

Global WindowID:Int

Type TWindow

Global Windows:TWindow[]
Global WindowCount:Int = -1
Global TopWindowID:Int = -1

Field Mode:Int
Field Name:String
Field X:Int
Field Y:Int
Field Width:Int
Field Height:Int
Field ID:Int
Field WID:String

Function Create(Name:String, x:Int, y:Int, width:Int, height:Int, wid:String)

Local Window:TWindow = New TWindow

WindowCount:+ 1

Window.name = name
Window.x = X
Window.y = Y
Window.Width = Width
Window.Height = Height
Window.ID = WindowCount
Window.WID = wid

Windows[WindowCount] = Window



End Function

Function SetWindowAmount(amount:Int)

Windows = New TWindow[amount]

End Function

Function DrawWindow()

For WindowID = 0 To WindowCount

If Windows[WindowID].Mode = 0

SetAlpha 0.4
SetBlend ALPHABLEND

End If

SetColor 255,255,0
DrawRect Windows[WindowID].X , Windows[WindowID].Y , Windows[WindowID].Width , Windows[WindowID].Height
SetColor 255, 255, 255

SetColor 180, 180, 0
DrawText Windows[WindowID].Name, Windows[WindowID].X + 7, Windows[WindowID].Y + 4

If Windows[WindowID].Mode = 0 Then
SetAlpha 1
SetBlend MASKBLEND
End If

Next

End Function

Function UpdateWindow()

For WindowID = WindowCount To 0 Step - 1

If MouseDown(1) And MouseX() > Windows[WindowID].X And MouseX() < Windows[WindowID].X + Windows[WindowID].Width And MouseY() > Windows[WindowID].Y And MouseY() < Windows[WindowID].Y + Windows[WindowID].Height

If Windows[WindowID].ID > TWindow.TopWindowID

TWindow.TopWindowID = Windows[WindowID].ID

End If

End If

Next

End Function

Function SetActiveWindow:Int()

Local tmpWindow:TWindow

If TopWindowID = -1 Return 0

tmpWindow = Windows[TopWindowID]

For Local id:Int = TopWindowID To WindowCount - 1

Windows[id] = Windows[id + 1]
Windows[id].ID = id
Windows[id].Mode = 0

Next

tmpWindow.ID = WindowCount
tmpWindow.Mode = 1

Windows[WindowCount] = tmpWindow

TopWindowID = - 1

End Function

EndType

Function StartGUI()

TWindow.SetActiveWindow()
TWindow.UpdateWindow()
TWindow.DrawWindow()

End Function


Graphics 1024, 768

TWindow.SetWindowAmount(3)

TWindow.Create("Testfenster 0", 50, 50, 200, 180, "Cyber")
TWindow.Create("Testfenster 1", 80, 80, 200, 180, "Cyber1")
TWindow.Create("Testfenster 2", 100, 70, 200, 180, "Cyber2")

Repeat

Cls

StartGUI()

Flip

Until KeyDown(KEY_ESCAPE)
End


So, erstmal, warum benutzt du kein SuperStrict? Das ist ne Todsünde Wink
Zweitens, ich mag keine Listen, ich komme mit den Dingern, jedenfalls bei solcher Verwaltung wie hier in dem Falle, nicht zurecht, ich habe also auf ein Array umgestellt welches Global im Type TWindow ist.
Drittens, mir gefällt dein Einrückstil gar nicht, ich fands furchtbar zum Lesen, benutze doch TAB und eine Leerzeile nach Dingen wie Function, If, Select, Type usw., du siehst es ja in meinem Code jetzt.
Natürlich ist das nicht perfekt, aber ich denke es ist um einiges besser lesbar als dein Ursprungscode.

btw was soll die UnderWindow Funktion bewirken Question Ich habs bis jetzt nicht geschnallt und gebraucht wird sie auch nicht ^^

So und nun viel Spaß beim weiterbasteln, wenn du noch Fragen hast, hier rein oder PM, mir egal Wink

MfG DaysShadow
Blessed is the mind too small for doubt

Mathias-Kwiatkowski

BeitragDo, Sep 17, 2009 2:15
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen lieben dank,

mh eigentlich sollte der code eingerückt sein, weiss nun nich wie er bei dir ankam, aber nun gut werd mich weiter bessern, und danke nochmal, hat mir sehr geholfen!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group