Kleine Buttonroutine ohne BB+

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

gehoersturz

Betreff: Kleine Buttonroutine ohne BB+

BeitragDo, Apr 01, 2004 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, hab mal eine kleine Buttonroutine geschrieben. Könnte sich dass mal einer anschauen und sagen ob das so taugt und ob man da noch was optimieren kann.

Habs mal wieder ein wenig verändert.

Beispielaufruf:
Code: [AUSKLAPPEN]

Global fontNorm = LoadFont ("Arial", 15)
ClsColor 100,100,100
Cls

Repeat
  If button("Weiter",20,20,100,15,204,204,204,2)=True Then ende=1
Until ende=1


Code: [AUSKLAPPEN]

Function button(txt$,x,y,b,h,ro,ge,bl,s)
;text,x,y,breite,höhe,rot,gelb,grün,schrift(0=s/1=w)
   If h < FontHeight() Then h = FontHeight()
    If b < StringWidth(txt$) Then b = StringWidth(txt$) + 2
   If MouseX() >= x And MouseX() <= x+b And MouseY() >= y And MouseY() <= y+h And MouseDown(1) Then
      Color 255,255,255
      Rect x,y,b,h,False
      Color 0,0,0
      Rect x,y,b-1,h-1,False
      Color ro,ge,bl
      Rect x+1,y+1,b-2,h-2 ,False
      Color ro/2,ge/2,bl/2
      Rect x+1,y+1,b-3,h-3,True
      Color ro,ge,bl
      Rect x+2,y+2,b-4,h-4,True
      Color 255*(1*s),255*(1*s),255*(1*s)
      Text x+(b/2)+1,y+(h/2)+1,txt$,1,1
      Repeat
         If MouseX() >= x And MouseX() <= x+b And MouseY() >= y And MouseY() <= y+h Then
            but = True
         Else
            but = False
            Exit
         EndIf
      Until MouseDown(1)=0
   Else
      Color 0,0,0
         Rect x,y,b,h,False
         Color 255,255,255
      Rect x,y,b-1,h-1
         Color ro/2,ge/2,bl/2
         Rect x+1,y+1,b-2,h-2,False
         Color ro,ge,bl
         Rect x+1,y+1,b-3,h-3,True
         Color 255*(1*s),255*(1*s),255*(1*s)
         Text x+(b/2),y+(h/2),txt$,1,1
         but = False
   EndIf
   Flip
      Return but
End Function
  • Zuletzt bearbeitet von gehoersturz am Do, Apr 01, 2004 23:52, insgesamt 3-mal bearbeitet

Triton

BeitragDo, Apr 01, 2004 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
VERSCHOBEN nach 2D.

Michi1988

BeitragDo, Apr 01, 2004 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt besseres. Lies dir mal das Forum unter 2d GFX durch. Da stehen richtig coole Routinen.
 

gehoersturz

BeitragDo, Apr 01, 2004 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal gesucht, aber nix gefunden. Nur komplette GUI und das soll ja nur einfache Buttons zu verfügung stellen. Aber wenn ich was übersehn habe bitte sagen, denn das Rad ist glaub ich schon erfunden !?

Michi1988

BeitragDo, Apr 01, 2004 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo aber ich finde es cool seine eigene Routine zu proggen. Würde nie eine andere benutzen. OBWOHL: im Mom geht meine net wirklich.

Travis

BeitragDo, Apr 01, 2004 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mich auch mal versucht.

EDIT: @ gehoersturz
Bei dir fehlt noch eine Anpassung, wenn man eine Buttongröße angibt, die
kleiner ist als der Buttontext. Dann sollte der Button entsprechend vergrößert werden.

Code: [AUSKLAPPEN]

Graphics 400,350,16,2
SetBuffer BackBuffer()
AppTitle "Buttons"

Repeat
 ClsColor 0,0,100
  Cls
   
   Text 0,00, "BUTTON A GEDRÜCKT:  " + Button(100,100,100,20,"OK")
   Text 0,10, "BUTTON B GEDRÜCKT:  " + Button(100,130,100,20,"ABBRUCH")
   Text 0,20, "BUTTON C GEDRÜCKT:  " + Button(100,160,100,20,"IGNORIEREN")
 
 Flip
Until KeyHit(1)
End


Function Button(x,y,w,h,Text$)
 If h < FontHeight() Then h = FontHeight()
 If w < StringWidth(Text$) Then w = StringWidth(Text$)

 Color 255,255,255
  If MouseOver(x,y,w,h) And MouseDown(1) Then Color 100,100,100
  Rect x,y,w,h,1
 Color 100,100,100
  If MouseOver(x,y,w,h) And MouseDown(1) Then Color 255,255,255
  Rect x+1, y+1, w-1, h-1,1
 Color 198,198,198
  If MouseOver(x,y,w,h) Then
   ;Color 100,150,150                      ; MouseOver Highlight
   ;If MouseDown(1) Then Color 150,150,100 ; PushDown Highlight
  EndIf
 Rect x+1, y+1, w-2, h-2,1
 Color 0,0,0
  Text x + w/2 - (StringWidth(Text$)/2), y + h/2 - (FontHeight()/2), Text$
  If MouseOver(x,y,w,h) And MouseDown(1) Then Return 1
End Function

Function MouseOver(x,y,w,h)
 If MouseX() > x And MouseX() < x+w And MouseY() > y And MouseY() < y+h Then Return 1
End Function
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

x.Force

BeitragDo, Apr 01, 2004 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ist es möglich das MouseOver gleich in die Button routine einzubauen? ist doch viel nützlicher

AMD Athlon XP 2000+ | 1024mb DDR-Ram | Asus Radeon 9600XT | BENQ FP757 17°Zoll TFT

Was kümmert mich mein Geschwätz von gestern? (Konrad Adenauer) -.-
 

gehoersturz

BeitragDo, Apr 01, 2004 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt eigentlich, wird sowieso nicht oft abgefragt. Habs mal geändert.

Jan_

Ehemaliger Admin

BeitragFr, Apr 02, 2004 6:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm, es gibt da einen Spruch, ich weiß nicht mehr denerfinder:
"Alles wurde schon mal gesagt, aber da niemand zuhört, muss man alles wieder und wieder erzählen!"

Schaut euch mal das Tut zum RPG editor an, ist doe nicht eine Sehr gute Button Routine dabei, in der DAtei Gui.bb ?!
between angels and insects
 

gehoersturz

BeitragFr, Apr 02, 2004 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, die ist echt gut, hab die für mich ein bisschen verändert. Das mit den Types ist echt praktisch, hab die bis jetzt noch nie benutzt.
 

Ensign Joe

BeitragFr, Apr 02, 2004 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Travis: Die ist cool ich hab sie noch etwas "verbessert":


Code: [AUSKLAPPEN]
Graphics 400,350,16,2
SetBuffer BackBuffer()
AppTitle "Buttons"
Repeat ClsColor 0,200,150
Cls
Schrift = LoadFont("ms sans serif", 8)
SetFont schrift
Text 0,00, "BUTTON A GEDRÜCKT: " + Button(100,100,100,20,37,"OK")
Text 0,10, "BUTTON B GEDRÜCKT: " + Button(100,130,100,20,46,"ABBRUCH")
Text 0,20, "BUTTON C GEDRÜCKT: " + Button(100,160,100,20,23,"IGNORIEREN")
Text 0,30, "BUTTON D GEDRÜCKT: " + Button(10,190,380,20,16,"DRÜCK MAL Q")
Flip
Until KeyHit(1)
FreeFont Schrift
End
Function Button(x,y,w,h,k,Text$)
If h < FontHeight() Then h = FontHeight()
If w < StringWidth(Text$) Then w = StringWidth(Text$)
Color 255,255,255
If (MouseOver(x,y,w,h) And MouseDown(1)) Or KeyDown(k) Then Color 100,100,100
Rect x,y,w,h,1
Color 100,100,100
If (MouseOver(x,y,w,h) And MouseDown(1)) Or KeyDown(k) Then Color 255,255,255
Rect x+1, y+1, w-1, h-1,1
Color 198,198,198
If MouseOver(x,y,w,h) Then
Color 100,150,150
If MouseDown(1) Then Color 150,150,100
EndIf
Rect x+1, y+1, w-2, h-2,1
Color 0,0,0
If k = 0 Then
textin$ = Text$
Else
textin$ = "(" + k + ") :: " + Text$
End If
Text x + w/2 - (StringWidth(Textin$)/2), y + h/2 - (FontHeight()/2), Textin$
If MouseOver(x,y,w,h) And MouseDown(1) Then Return 1
End Function
Function MouseOver(x,y,w,h)
If MouseX() > x And MouseX() < x+w And MouseY() > y And MouseY() < y+h Then Return 1
End Function


Neuerungen:
Auswahl nun per Taste möglich (Variable k setzt die Taste mit Hilfe des Scancodes :: anstatt Abbrechen kommt (46) Abbrechen, das heißt C ist der Button Abbrechen.

Dann wurde der Rem (;) vor der Light-Over routine entfernt.

Es wird jetzt folgender Parameter für die Schrift verwendet:
Code: [AUSKLAPPEN]
Schrift = LoadFont("Ms Sans Serif", 8)
SetFont Schrift


Der Hintergrund wurde etwas heller, damit man die Texte mit Button A gedrückt 1 besser sieht.
 

gehoersturz

BeitragFr, Apr 02, 2004 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mal die Routine von Jan genommen und etwas abgeändert. Ist bestimmt noch einiges zu verbessern, aber sie funzt zumindest schon mal.

Die Buttons verhalten sich jetzt wie die von Windows, d.h. wird ein Button angeklickt, die maustaste nicht losgelassen und den Mauszeiger vom Button runtergezogen, wird keine wert zurückgegeben. Hoffentlich versteht ihr was ich meine Smile

Aufruf:
Code: [AUSKLAPPEN]

Include "GUI.bb"
Graphics 640,480,16,2
fontArial15 = LoadFont("Arial",15)
SetFont fontArial15
test1 = Create_gsButton("hallo",10,10,0,0,255,0,0)
test2 = Create_gsButton("Unnötig viel Text in einem Button",10,50,0,0)
ende = Create_gsButton("Ende",10,90,100,20)
Color 255,255,255
SetBuffer BackBuffer()
ClsColor 100,100,100
Repeat
   Cls
   Draw_gsGUI()
   Select Check_gsButton()
      Case test1
         Text 200,10,"test1"
      Case test2
         Text 200,50,"test2"
      Case ende
         End
      Case False
         Text 200,90,"False"
   End Select
   Flip
Forever


GUI.bb
Code: [AUSKLAPPEN]

Type gsButton
   Field image
   Field x
   Field y
   Field state
End Type

Function Check_gsButton()
   button = False
   For but.gsButton = Each gsButton
      but\state = 0
      If MouseOver(but\x,but\y,ImageWidth(but\image),ImageHeight(but\image)) And MouseDown(1) Then
         SetBuffer FrontBuffer()
         Repeat
            If MouseOver(but\x,but\y,ImageWidth(but\image),ImageHeight(but\image)) Then
               but\state = 1
               button = but\image
               DrawBlock but\image,but\x,but\y,but\state
            Else
               button = False
               but\state = 0
               DrawBlock but\image,but\x,but\y,but\state
            EndIf
         Until MouseDown(1)=0
         SetBuffer BackBuffer()
      Else
         but\state = 0
      EndIf
   Next
   Return button
End Function

Function MouseOver(x,y,w,h)
   If MouseX() => x And MouseX() <= x+w And MouseY() => y And MouseY() <= y+h Then Return 1
End Function

Function Draw_gsGUI()
   For but.gsButton = Each gsButton
      DrawBlock but\image,but\x,but\y,but\state
   Next
End Function

Function Create_gsButton(txt$,x=0,y=0,b=100,h=20,ro=204,ge=204,bl=204,s=0)
;text,x,y,breite,höhe,rot,gelb,grün,schrift(0=s/1=w)
   red = ColorRed()
   green = ColorGreen()
   blue = ColorBlue()
   If h < StringHeight(txt$) Then h = StringHeight(txt$)
    If b < StringWidth(txt$) Then b = StringWidth(txt$)+6
   but.gsButton = New gsButton
   but\image = CreateImage(b,h,2)
   but\x = x
   but\y = y
   but\state = 0
   SetBuffer ImageBuffer(but\image,0)   
   Color 0,0,0
     Rect 0,0,b,h,False
      Color 255,255,255
   Rect 0,0,b-1,h-1
      Color ro/2,ge/2,bl/2
   Rect 1,1,b-2,h-2,False
   Color ro,ge,bl
   Rect 1,1,b-3,h-3,True
   Color 255*(1*s),255*(1*s),255*(1*s)
   Text (b/2),(h/2),txt$,1,1
   SetBuffer ImageBuffer(but\image,1)
   Color 255,255,255
   Rect 0,0,b,h,False
   Color 0,0,0
   Rect 0,0,b-1,h-1,False
   Color ro,ge,bl
   Rect 1,1,b-2,h-2 ,False
   Color ro/2,ge/2,bl/2
   Rect 1,1,b-3,h-3,True
   Color ro,ge,bl
   Rect 2,2,b-4,h-4,True
   Color 255*(1*s),255*(1*s),255*(1*s)
   Text (b/2)+1,(h/2)+1,txt$,1,1
   Color red,green,blue
   Return but\image
End Function

Jan_

Ehemaliger Admin

BeitragMo, Apr 05, 2004 7:33
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr schön, werde ich mal testen!
between angels and insects
 

gehoersturz

BeitragMo, Apr 05, 2004 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Buttons funktionieren nicht ganz so wie sie eigentlich sollten. Vorallem im Fullscreenmodus passt das noch nicht so ganz. Ist vielleicht was mit den Buffern, aber ganz sicher bin ich mir nicht vom Stil her ist das bestimmt auch nicht ganz sauber.
 

gehoersturz

BeitragMi, Apr 07, 2004 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hat noch irgendjemand eine kleine Routine die vorallem vom Ansatz her anders ist?
 

Ensign Joe

BeitragMi, Apr 07, 2004 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit anders ???
 

gehoersturz

BeitragMi, Apr 07, 2004 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt immer eine ganze Möglichkeiten ein Problem zu lösen. Bin halt gerade am lernen und wenn ich sehe wie es andere machen, kann ich daraus lernen wie man es noch machen könnte.
 

Ensign Joe

BeitragMi, Apr 07, 2004 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
aha...

Ich progge gerade nebenher, wenn mir gerade langweilig ist, eine GUI-Routine, die Buttons, windows etc. unterstützt ohne BB+

TheProgrammer

BeitragFr, Apr 09, 2004 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hab ich was:

Code: [AUSKLAPPEN]

Graphics 140,70,32,2
SetBuffer BackBuffer()
AppTitle "Buttons"

ClsColor 192,192,192
font = LoadFont("Tahoma",16,0,0,0)
SetFont font

Repeat
 Cls
 but1 = DrawButton(20,10,"gesperrt",100,20,1)
 but2 = DrawButton(20,40,"Ende",100,20,0)
 but2_press = PressButton(but2,but2_press)
 If but2_press = True Then End
 Flip
Forever

Function DrawButton(X,Y,txt$,breite,hohe,modus)

    If MouseX() > X And MouseX() < X+breite And MouseY() > Y And MouseY() < Y+hohe And MouseDown(1) Then
     Color 192,192,192
     Rect X,Y,breite,hohe
     If modus = 0 Then
      Color 0,0,0
      Text X+(breite/2)+1,Y+(hohe/2)+1,txt,1,1
     EndIf
     Color 110,110,110
     Line X,Y,breite+X,Y
     Line X,Y,X,Y+hohe
     Color 230,230,230
     Line X,Y+hohe,X+breite,Y+hohe
     Line X+breite,Y,X+breite,Y+hohe
     Color 150,150,150
     Line X+1,Y+1,breite+X-1,Y+1
     Line X+1,Y+1,X+1,Y+hohe-1
     Color 210,210,210
     Line X+1,Y+hohe-1,X+breite-1,Y+hohe-1
     Line X+breite-1,Y+1,X+breite-1,Y+hohe-1
     If modus = 0
      Return 1
     Else
      Color 150,150,150
      Text X+(breite/2),Y+(hohe/2),txt,1,1
      Color 230,230,230
      Line X,Y,breite+X,Y
      Line X,Y,X,Y+hohe
      Color 110,110,110
      Line X,Y+hohe,X+breite,Y+hohe
      Line X+breite,Y,X+breite,Y+hohe
      Color 210,210,210
      Line X+1,Y+1,breite+X-1,Y+1
      Line X+1,Y+1,X+1,Y+hohe-1
      Color 150,150,150
      Line X+1,Y+hohe-1,X+breite-1,Y+hohe-1
      Line X+breite-1,Y+1,X+breite-1,Y+hohe-1
     EndIf
    Else 
     Color 192,192,192
     Rect X,Y,breite,hohe
     Color 0,0,0
    If modus = 1 Then Color 150,150,150
     Text X+(breite/2),Y+(hohe/2),txt,1,1
     Color 230,230,230
     Line X,Y,breite+X,Y
     Line X,Y,X,Y+hohe
     Color 110,110,110
     Line X,Y+hohe,X+breite,Y+hohe
     Line X+breite,Y,X+breite,Y+hohe
     Color 210,210,210
     Line X+1,Y+1,breite+X-1,Y+1
     Line X+1,Y+1,X+1,Y+hohe-1
     Color 150,150,150
     Line X+1,Y+hohe-1,X+breite-1,Y+hohe-1
     Line X+breite-1,Y+1,X+breite-1,Y+hohe-1
   EndIf

End Function 

Function PressButton(but,press_but)

   If but = 1 Then
    press_but = 2
   EndIf
   
   
   If press_but = 2 Then
    If Not MouseDown(1) Then Return 1
   EndIf
   
   If but = 0 Then press_but = 0
   
   Return press_but

End Function
aktuelles Projekt: The last day of human being
 

Ensign Joe

BeitragFr, Apr 09, 2004 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheProgramme: Question Soll ich das einbauen?

(Dann hätt ich weniger Arbeit) Wink

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group