2D-Drawing Vollbildoberfläche (Buttons)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

2D-Drawing Vollbildoberfläche (Buttons)

Beitrag von dllfreak2001 »

Programmier grad daran:
Eine Vollbildoberfläche für PBs Vollbildmodus.

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

; Desktopauflösung ermitteln
Global deskw.l,deskh.l
ExamineDesktops()

deskw = DesktopWidth(0)
deskh = DesktopHeight(0)

Structure gadget
  id.l
  posx.l
  posy.l
  width.l
  height.l
  title.s
  group.l
  state.l
  mode.b
EndStructure

Global NewList buttons.gadget()
Global xmouse.l, ymouse.l, lbutton.b, presslbutton.b, presslgroup.l, bmarked.l

Procedure CheckMouse()
  xmouse = MouseX()
  ymouse = MouseY()
  lbutton = MouseButton(#PB_MouseButton_Left)
EndProcedure

Procedure DisplayCursor()

  StartDrawing(ScreenOutput())
    

        FrontColor(0)
        Line(xmouse+1,ymouse-5,0,13)
        Line(xmouse-5,ymouse+1,13,0)

        FrontColor(RGB(255,255,255))
        Line(xmouse,ymouse-6,0,13)
        Line(xmouse-6,ymouse,13,0)
  StopDrawing()
EndProcedure

Procedure.l NewButton(id.l, posx.l,posy.l,width.l,height.l,title$,group.l,state.l,mode.b)

  adr.l = AddElement(buttons())
  buttons()\id = id
  buttons()\posx = posx
  buttons()\posy = posy
  buttons()\width = width
  buttons()\height = height
  
  buttons()\title = title$
  buttons()\group = group
  buttons()\state = state
  buttons()\mode = mode
  
  ProcedureReturn adr
  
EndProcedure

Procedure RenderButton(posx.l,posy.l,width.l, height.l, text$, mode.b, marked.b)

      Box(posx,posy,width,height,RGB(150,150,150))
      
     
      
      If mode = 0
        FrontColor(RGB(255,255,255))
      Else
        FrontColor(RGB(50,50,50))
      EndIf
      
      
      Line(posx,posy,width,0)
      Line(posx,posy,0,height)
      
      If mode = 0
        FrontColor(RGB(50,50,50))
      Else
        FrontColor(RGB(255,255,255))
      EndIf

      Line(posx,posy+height-1,width,0)
      Line(posx+width-1,posy,0,height)
      
      
      
      If marked
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(posx+2,posy+2,width-4,height-4,RGB(210,210,210))
      EndIf
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(posx+4,posy+height/2-9,text$,0)
      DrawText(posx+5,posy+height/2-8,text$,RGB(255,255,255))


EndProcedure

Procedure DisplayButtons()
  
  lcount.l = CountList(buttons())

   StartDrawing(ScreenOutput())
  If lcount > 0
    FirstElement(buttons())
    For n = 0 To lcount-1
      mark.b = 0
      If buttons()\id = bmarked
        mark = 1
      EndIf
      
      RenderButton(buttons()\posx,buttons()\posy,buttons()\width, buttons()\height, buttons()\title, buttons()\state, mark)

      NextElement(buttons())

    Next
  EndIf
  StopDrawing()



EndProcedure

Procedure.l ButtonEvent()
  ret.l = -1
  
  lcount.l = CountList(buttons())

  
  If lcount > 0
    FirstElement(buttons())
    For n = 0 To lcount-1
      
      If xmouse > buttons()\posx And xmouse < buttons()\posx + buttons()\width  And ymouse > buttons()\posy And ymouse < buttons()\posy + buttons()\height
        
        highlighted.b = 1
        
        If presslbutton = 0 Or buttons()\group <> presslgroup
          
          
          bmarked = buttons()\id
          
          If buttons()\mode = 0
            buttons()\state = 0
          EndIf

        
        Else
        
        
          If buttons()\mode = 0 
            buttons()\state = 1 
          EndIf

          bmarked = -1
        EndIf

        If lbutton = 0 And presslbutton = 1 
          
          If presslgroup = buttons()\group
                        
            
            If buttons()\mode = 1 
              If buttons()\state = 1 
                buttons()\state = 0
              Else
                buttons()\state = 1 
              EndIf
            EndIf
            
            
            ret = buttons()\id
            presslbutton = 0
          Else
            presslbutton = 0
          EndIf
          
        ElseIf lbutton = 1 And presslbutton = 0
          presslbutton = 1
          presslgroup = buttons()\group
          
        EndIf
        
      ElseIf buttons()\mode = 0
  
          buttons()\state = 0
  
        
      EndIf
      NextElement(buttons())
      
    Next
  EndIf
  
  If ret = -1 And lbutton = 0
    presslbutton = 0
  EndIf
  If highlighted = 0
    bmarked = -1
  EndIf
  
  
  
  
  ProcedureReturn ret


EndProcedure

Procedure.b KillButtonID(buttonid.l)


  KillIDAgain:
  lcount.l = CountList(buttons())
  
  If lcount > 0
    FirstElement(buttons())
    For n = 0 To lcount-1
      If buttons()\id = buttonid
        DeleteElement(buttons())
        If CountList(buttons()) > 0
          Goto KillIDAgain
          
        
        EndIf
        
        
      EndIf
      NextElement(buttons())
    Next
    
  
  EndIf
  
EndProcedure

Procedure.b KillButtonGroup(buttongroup.l)
  KillGroupAgain:
  lcount.l = CountList(buttons())
  
  If lcount > 0
    FirstElement(buttons())
    For n = 0 To lcount-1
      If buttons()\group = buttongroup
        DeleteElement(buttons())
        If CountList(buttons()) > 0
          Goto KillGroupAgain
          
        
        EndIf
        
        
      EndIf
      NextElement(buttons())
    Next
    
  
  EndIf
  
EndProcedure

; ****Beispiel 1****
; bc.l = -1
; For x = 0 To 15:For y = 0 To 15
;   bc + 1
;   NewButton(bc,x*32,y*32,30,30,Chr(bc),x,0,1)
; Next:Next


; ****Beipiel 2****

; Ein Menü in einer Buttongroup
NewButton(0,20,100,100,20,"Neu",1, 0,0)
NewButton(2,20,120,100,20,"Öffnen",1,0,0)
NewButton(3,20,140,100,20,"Speichern",1,0,0)
NewButton(4,20,160,100,20,"Beenden",1,0,0)

; Einzelne Toggle Buttons
NewButton(5,0,deskh-120,100,40,"Nehmen",5, 0,1)
NewButton(6,0,deskh-80,100,40,"Öffnen",6, 0,1)
NewButton(7,0,deskh-40,100,40,"Benutzen",7, 0,1)
NewButton(8,100,deskh-120,100,40,"Werfen",8, 1,1)
NewButton(9,100,deskh-80,100,40,"Inventar",9, 0,1)
NewButton(10,100,deskh-40,100,40,"Pause",10, 0,1)


NewButton(0,200,200,220,220,"Neu zum zweiten mal",28, 1,1)


OpenScreen(deskw,deskh,32,"Small Full Screen GUI v1.0")

Repeat
  ExamineKeyboard()
  ExamineMouse()
  CheckMouse() ; Mauschecken
  
  bevent.l = ButtonEvent()
  If bevent <> -1
    texto$ = Str(bevent)
   ; KillButtonID(bevent)
  EndIf

  StartDrawing(ScreenOutput())
    DrawText(500,0,"EventID = "+ texto$)
  StopDrawing()

  DisplayButtons() ;Knöpfe darstellen
  
  DisplayCursor() ;Mauszeiger darstellen




  FlipBuffers()
  ClearScreen(0)
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
I´a dllfreak2001
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich bekomme da einen Linker Error:
Linker Error hat geschrieben:Desktop.a(ExamineDesktops.o): In function `PB_ExamineDesktops':
Examine Desktops.c(.text+0x4a): undefined reference to `gdk_get_display'
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Ich nutze PB 4.02, das ist eine PB-Funktion um die Desktopauflösung zu ermitteln. Du kannst ja den Befehl rausmachen und deskw und deskh die Werte direkt übergeben, bei mir funzt es aber.

Hier mit fester Auflösung....

Code: Alles auswählen


InitSprite() 
InitKeyboard() 
InitMouse() 

; Desktopauflösung ermitteln 
Global deskw.l,deskh.l 

deskw = 1024 ;-Auflösung einstellen
deskh = 768 

Structure gadget 
  id.l 
  posx.l 
  posy.l 
  width.l 
  height.l 
  title.s 
  group.l 
  state.l 
  mode.b 
EndStructure 

Global NewList buttons.gadget() 
Global xmouse.l, ymouse.l, lbutton.b, presslbutton.b, presslgroup.l, bmarked.l 

Procedure CheckMouse() 
  xmouse = MouseX() 
  ymouse = MouseY() 
  lbutton = MouseButton(#PB_MouseButton_Left) 
EndProcedure 

Procedure DisplayCursor() 

  StartDrawing(ScreenOutput()) 
    

        FrontColor(0) 
        Line(xmouse+1,ymouse-5,0,13) 
        Line(xmouse-5,ymouse+1,13,0) 

        FrontColor(RGB(255,255,255)) 
        Line(xmouse,ymouse-6,0,13) 
        Line(xmouse-6,ymouse,13,0) 
  StopDrawing() 
EndProcedure 

Procedure.l NewButton(id.l, posx.l,posy.l,width.l,height.l,title$,group.l,state.l,mode.b) 

  adr.l = AddElement(buttons()) 
  buttons()\id = id 
  buttons()\posx = posx 
  buttons()\posy = posy 
  buttons()\width = width 
  buttons()\height = height 
  
  buttons()\title = title$ 
  buttons()\group = group 
  buttons()\state = state 
  buttons()\mode = mode 
  
  ProcedureReturn adr 
  
EndProcedure 

Procedure RenderButton(posx.l,posy.l,width.l, height.l, text$, mode.b, marked.b) 

      Box(posx,posy,width,height,RGB(150,150,150)) 
      
      
      
      If mode = 0 
        FrontColor(RGB(255,255,255)) 
      Else 
        FrontColor(RGB(50,50,50)) 
      EndIf 
      
      
      Line(posx,posy,width,0) 
      Line(posx,posy,0,height) 
      
      If mode = 0 
        FrontColor(RGB(50,50,50)) 
      Else 
        FrontColor(RGB(255,255,255)) 
      EndIf 

      Line(posx,posy+height-1,width,0) 
      Line(posx+width-1,posy,0,height) 
      
      
      
      If marked 
        DrawingMode(#PB_2DDrawing_Outlined) 
        Box(posx+2,posy+2,width-4,height-4,RGB(210,210,210)) 
      EndIf 
      
      DrawingMode(#PB_2DDrawing_Transparent) 
      DrawText(posx+4,posy+height/2-9,text$,0) 
      DrawText(posx+5,posy+height/2-8,text$,RGB(255,255,255)) 


EndProcedure 

Procedure DisplayButtons() 
  
  lcount.l = CountList(buttons()) 

   StartDrawing(ScreenOutput()) 
  If lcount > 0 
    FirstElement(buttons()) 
    For n = 0 To lcount-1 
      mark.b = 0 
      If buttons()\id = bmarked 
        mark = 1 
      EndIf 
      
      RenderButton(buttons()\posx,buttons()\posy,buttons()\width, buttons()\height, buttons()\title, buttons()\state, mark) 

      NextElement(buttons()) 

    Next 
  EndIf 
  StopDrawing() 



EndProcedure 

Procedure.l ButtonEvent() 
  ret.l = -1 
  
  lcount.l = CountList(buttons()) 

  
  If lcount > 0 
    FirstElement(buttons()) 
    For n = 0 To lcount-1 
      
      If xmouse > buttons()\posx And xmouse < buttons()\posx + buttons()\width  And ymouse > buttons()\posy And ymouse < buttons()\posy + buttons()\height 
        
        highlighted.b = 1 
        
        If presslbutton = 0 Or buttons()\group <> presslgroup 
          
          
          bmarked = buttons()\id 
          
          If buttons()\mode = 0 
            buttons()\state = 0 
          EndIf 

        
        Else 
        
        
          If buttons()\mode = 0 
            buttons()\state = 1 
          EndIf 

          bmarked = -1 
        EndIf 

        If lbutton = 0 And presslbutton = 1 
          
          If presslgroup = buttons()\group 
                        
            
            If buttons()\mode = 1 
              If buttons()\state = 1 
                buttons()\state = 0 
              Else 
                buttons()\state = 1 
              EndIf 
            EndIf 
            
            
            ret = buttons()\id 
            presslbutton = 0 
          Else 
            presslbutton = 0 
          EndIf 
          
        ElseIf lbutton = 1 And presslbutton = 0 
          presslbutton = 1 
          presslgroup = buttons()\group 
          
        EndIf 
        
      ElseIf buttons()\mode = 0 
  
          buttons()\state = 0 
  
        
      EndIf 
      NextElement(buttons()) 
      
    Next 
  EndIf 
  
  If ret = -1 And lbutton = 0 
    presslbutton = 0 
  EndIf 
  If highlighted = 0 
    bmarked = -1 
  EndIf 
  
  
  
  
  ProcedureReturn ret 


EndProcedure 

Procedure.b KillButtonID(buttonid.l) 


  KillIDAgain: 
  lcount.l = CountList(buttons()) 
  
  If lcount > 0 
    FirstElement(buttons()) 
    For n = 0 To lcount-1 
      If buttons()\id = buttonid 
        DeleteElement(buttons()) 
        If CountList(buttons()) > 0 
          Goto KillIDAgain 
          
        
        EndIf 
        
        
      EndIf 
      NextElement(buttons()) 
    Next 
    
  
  EndIf 
  
EndProcedure 

Procedure.b KillButtonGroup(buttongroup.l) 
  KillGroupAgain: 
  lcount.l = CountList(buttons()) 
  
  If lcount > 0 
    FirstElement(buttons()) 
    For n = 0 To lcount-1 
      If buttons()\group = buttongroup 
        DeleteElement(buttons()) 
        If CountList(buttons()) > 0 
          Goto KillGroupAgain 
          
        
        EndIf 
        
        
      EndIf 
      NextElement(buttons()) 
    Next 
    
  
  EndIf 
  
EndProcedure 

; ****Beispiel 1**** 
; bc.l = -1 
; For x = 0 To 15:For y = 0 To 15 
;   bc + 1 
;   NewButton(bc,x*32,y*32,30,30,Chr(bc),x,0,1) 
; Next:Next 


; ****Beipiel 2**** 

; Ein Menü in einer Buttongroup 
NewButton(0,20,100,100,20,"Neu",1, 0,0) 
NewButton(2,20,120,100,20,"Öffnen",1,0,0) 
NewButton(3,20,140,100,20,"Speichern",1,0,0) 
NewButton(4,20,160,100,20,"Beenden",1,0,0) 

; Einzelne Toggle Buttons 
NewButton(5,0,deskh-120,100,40,"Nehmen",5, 0,1) 
NewButton(6,0,deskh-80,100,40,"Öffnen",6, 0,1) 
NewButton(7,0,deskh-40,100,40,"Benutzen",7, 0,1) 
NewButton(8,100,deskh-120,100,40,"Werfen",8, 1,1) 
NewButton(9,100,deskh-80,100,40,"Inventar",9, 0,1) 
NewButton(10,100,deskh-40,100,40,"Pause",10, 0,1) 


NewButton(0,200,200,220,220,"Neu zum zweiten mal",28, 1,1) 


OpenScreen(deskw,deskh,32,"Small Full Screen GUI v1.0") 

Repeat 
  ExamineKeyboard() 
  ExamineMouse() 
  CheckMouse() ; Mauschecken 
  
  bevent.l = ButtonEvent() 
  If bevent <> -1 
    texto$ = Str(bevent) 
   ; KillButtonID(bevent) 
  EndIf 

  StartDrawing(ScreenOutput()) 
    DrawText(500,0,"EventID = "+ texto$) 
  StopDrawing() 

  DisplayButtons() ;Knöpfe darstellen 
  
  DisplayCursor() ;Mauszeiger darstellen 




  FlipBuffers() 
  ClearScreen(0) 
Until KeyboardPushed(#PB_Key_Escape) 
CloseScreen()
I´a dllfreak2001
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Funktioniert! :allright:
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Jup, das hat aber nix mit meinem Code zutun.
Vielleicht ist es ja ein Bug von PB, welche Version von PB nutzt du denn?

Sollte vielleicht in den passenden Thread als Bugreport gemeldet werden.
I´a dllfreak2001
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

dllfreak2001 hat geschrieben:Jup, das hat aber nix mit meinem Code zutun.
Vielleicht ist es ja ein Bug von PB, welche Version von PB nutzt du denn?

Sollte vielleicht in den passenden Thread als Bugreport gemeldet werden.
Anhand der Fehlermeldung schließe ich schon mal auf Linux als OS :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag von walker »

NicTheQuick hat geschrieben:Ich bekomme da einen Linker Error:
Linker Error hat geschrieben:Desktop.a(ExamineDesktops.o): In function `PB_ExamineDesktops':
Examine Desktops.c(.text+0x4a): undefined reference to `gdk_get_display'
einfach ein gtk_init_(0,0) an den Anfang setzen.... dann sollte es funktionieren (oder einfach ein window öffnen.. dan wird gtk_init von PB aufgerufen)
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Werde den Kramm erweitern und optimieren.

Dann noch andere Gadgets

Ich werde das dann so überführen, dass man Gruppen bilden kann um zB. Menüs zu erzeugen sowie Panels. Den Gadgets wird eine PanelID zugewiesen. Wird das Panel nicht benötigt kann man es deaktivieren (es wird also ausgeblendet) ohne das man die ganzen Buttons und Co. Löschen muss.
zB. ein Spiel hat ein Optionsmenü mit Grafik, Sound und Spieloptionen

Ich denke man braucht noch ne Art Scrollbar/Trackbar ein listviewgadget
und ein Textfeld für Eingaben.

Damit man so das mindeste abgedeckt hat für Spiele und Co.
I´a dllfreak2001
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag von c4s »

Ich möchte dich ehrlich nicht demotivieren und es scheint ja ganz gut zu sein
was du da machst..aber schau dir mal sgx von #NULL an!
Hat alle Gadgets und ne Dokumentation.

Nur als Tipp, bevor du dir zu viel Arbeit machst und es dann erst später
bemerkst, denn man muss ja nicht immer das Rad neu erfinden :allright:

P.S.
Ich verstehe auch nicht, warum einige hier darauf bestehen so wenig wie
möglich User-Libs zu benutzen. Gut die Aktualität der Libs ist ein Argument,
aber iwie aus Stolz ...naja egal :wink:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

:| Tja, wäre der Titel von Nulls Präsentation Aussagekräftiger gewesen, hätte ich sie wahrscheinlich gefunden und garnicht erst damit angefangen.
Aber wenn ich schon dabei bin...
Außerdem ist es einen gute Übung für mich...

PS.: Wie ich da lese funzt seine Lib nur für Windows...
Außerdem soweit möchte ich auch nicht gehen. Seine Lib ist sehr umfangreich. Ich möchte nur nen Satz Grundgadgets erstellen die per 2D-Drawing ohne extra Grafiken auskommen. Fenster, Comboboxen und Checkboxen werde ich garnicht erst anbieten.
I´a dllfreak2001
Antworten