Buttonleiste mit Canvasgadget

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
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Buttonleiste mit Canvasgadget

Beitrag von hjbremer »

Nun habe ich auch PB 4.6 und um das Canvasgadget auszuprobieren, habe ich mal einen alten Code (den ich noch immer nutze) umgeschrieben.

Der größte Unterschied zum ButtonImageGadget ist der völlige Verzicht auf Api.

Hier die Include

Code: Alles auswählen

;Canvas Toggle ButtonLeiste by HJ Bremer - erstellt mit PureBasic 4.61 Beta 1 x86

;Hinweis: sollte es einen Font mit der PbNr null bereits geben, dann wird er benutzt.
;         falls unerwünscht muß myButtonLeisteSetFont() aufgerufen werden.  

EnableExplicit

Structure myButtonLeiste
   window.i          ;myButtonLeiste gehört zu welchem Fenster
   fontnr.i          ;PB Fontnr, keine ID
   anzGadget.i       ;Anzahl Gadgets ab 1 gezählt
   lastpressed.i     ;zuletzt gedrückter Button
   Array pbnr.i(0)   ;PB-Nummern
   Array text.s(0)   ;zugehöriger Text
   Array state.i(0)  ;Status gedrückt, normal, Mouse over
   icons.i[3]           ;Icons 0 - 2, für jeden Status eins
   color.COMPCOLOR[3]   ;Farben 0 bis 2 für jeden Status
EndStructure

Procedure.i myButtonLeisteMemory()
   
   ;diese Prozedur ersetzt das ständige Übergeben von Parametern oder
   ;globale bzw. shared Variablen, indem es einen eigenen Memoryblock 
   ;reserviert. Jede der folgenden Prozeduren muß myButtonLeisteMemory 
   ;aufrufen um Zugriff zu haben.
   
   Static myMemory
   
   If Not myMemory 
      myMemory = AllocateMemory(SizeOf(myButtonLeiste))
   EndIf
   
   ProcedureReturn myMemory
EndProcedure
Procedure.i myButtonLeisteSetImage(index, state)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   With *i
      
      Protected cvgbr = GadgetWidth(\pbnr(index))
      Protected cvghh = GadgetHeight(\pbnr(index))
      
      Protected j, k, imgsp, imgze, imghh, txtsp, txtze, txtbr, txthh
      
      Select state
         Case #PB_EventType_Focus      : j = 0
         Case #PB_EventType_LostFocus  : j = 1
         Case #PB_EventType_MouseEnter : j = 2
      EndSelect
      
      Protected textcolor = \color[j]\crText
      Protected boxcolor  = \color[j]\crBackground
      Protected effects   = \color[j]\dwEffects
      
      StartDrawing(CanvasOutput(\pbnr(index)))
         ;Hintergrund
         DrawingMode(#PB_2DDrawing_Gradient) 
         FrontColor(boxcolor)
         BackColor($FAFAFA)      
         LinearGradient(cvgbr/2, 0, cvgbr/2, cvghh)
         If effects: LinearGradient(15, 5, cvgbr * 2, cvghh): EndIf
         Box(0, 0, cvgbr, cvghh)
         ;Image, möglichst ein Icon
         For k = 0 To 2
            If j = k And \icons[k]
               imghh = ImageHeight(\icons[k])
               If imghh + 12 > cvghh: imghh = cvghh - 12: EndIf
               imgsp = 5
               imgze = (cvghh - imghh - 4) / 2 
               DrawImage(ImageID(\icons[k]), imgsp, imgze, imghh, imghh)
            EndIf
         Next
         ;Text
         DrawingMode(#PB_2DDrawing_Transparent)
         DrawingFont(FontID(\fontnr))
         FrontColor(textcolor)
         txtbr = TextWidth(\text(index))
         txthh = TextHeight(\text(index))
         txtsp = (cvgbr - txtbr) / 2
         txtze = (cvghh - txthh) / 2
         DrawText(txtsp, txtze - 2, \text(index))         
      StopDrawing()
      
   EndWith  
EndProcedure
Procedure.i myButtonLeisteSetIcons(a, b, c = 0)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter a,b,c sind Adressen auf ein Label in einer DataSection
   ;Procedure sollte vor myButtonLeiste() aufgerufen werden
   ;hinterher ist auch möglich, aber nur einmal
   
   Static flag   
   If Not flag
      flag = 1
      If a: *i\icons[0] = CatchImage(#PB_Any, a): EndIf
      If b: *i\icons[1] = CatchImage(#PB_Any, b): EndIf
      If c: *i\icons[2] = CatchImage(#PB_Any, c): EndIf
      For j = 1 To *i\anzGadget
         If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf      
      Next
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteSetColors(*p.integer = 0)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: *p = Adresse der Datasection oder eines Array
   ;Procedure sollte vor myButtonLeiste() aufgerufen um Farben festzulegen
   ;Procedure kann auch nach myButtonLeiste() aufgerufen um Farben zu ändern
      
   If *p = 0: *p = ?myButtonLeisteColorsIntern: EndIf      
   
   For j = 0 To 2
      *i\color[j]\crText       = *p\i: *p + SizeOf(integer)
      *i\color[j]\crBackground = *p\i: *p + SizeOf(integer)
      *i\color[j]\dwEffects    = *p\i: *p + SizeOf(integer)
   Next
   
   For j = 1 To *i\anzGadget
      If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf      
   Next
      
DataSection
  myButtonLeisteColorsIntern:
  Data.i #Black , #Green  , 1  ;Pressed
  Data.i #Black , $E0C5AC , 0  ;Normal
  Data.i #Blue  , #Red    , 0  ;Over
EndDataSection
   
EndProcedure
Procedure.i myButtonLeisteSetFont(fontnr = -1)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: fontnr ist eine Pbnr
   ;Procedure sollte vor myButtonLeiste() aufgerufen um einen Font festzulegen
   ;Procedure kann auch nach myButtonLeiste() aufgerufen um den Font zu ändern
   
   If Not IsFont(fontnr)
      fontnr = LoadFont(#PB_Any, "Arial", 12)
   EndIf   
   *i\fontnr = fontnr
   
   If IsFont(*i\fontnr) 
      For j = 1 To *i\anzGadget
         If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf
      Next
   EndIf      
   
   ProcedureReturn *i\fontnr
EndProcedure
Procedure.i myButtonLeisteSetButton(nr = 1)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: nr des Buttons der gedrückt werden soll
   ;Hinweis:   es wird kein Event erzeugt
   ;Procedure kann vor oder nach myButtonLeiste() aufgerufen werden
   
   If nr 
      If *i\anzGadget >= nr
         If *i\lastpressed
            *i\state(*i\lastpressed) = #PB_EventType_LostFocus
            myButtonLeisteSetImage(*i\lastpressed, #PB_EventType_LostFocus)
         EndIf
         *i\state(nr) = #PB_EventType_Focus
         myButtonLeisteSetImage(nr, *i\state(nr))
      EndIf   
      *i\lastpressed = nr
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteSetToolTip(nr, text.s)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: nr des Buttons 
   ;Procedure kann nur nach myButtonLeiste() aufgerufen werden
   
   If nr 
      If *i\anzGadget >= nr
         If IsGadget(*i\pbnr(nr))
            GadgetToolTip(*i\pbnr(nr), text) 
         EndIf
      EndIf   
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteEvent(wb)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   Protected j, index = 0
      
   With *i
      
      ;gehört das Gadget zur Buttonleiste ?
      For j = 1 To \anzGadget
         If \pbnr(j) = wb: index = j: Break: EndIf 
      Next
      
      ;Gadget gehört zur Buttonleiste, wenn index wahr
      If index             
         
         Select EventType()
               
            Case #PB_EventType_MouseEnter
               myButtonLeisteSetImage(index, #PB_EventType_MouseEnter)
               
            Case #PB_EventType_MouseLeave
               If \state(index) = #PB_EventType_Focus
                  myButtonLeisteSetImage(index, #PB_EventType_Focus)
               Else
                  myButtonLeisteSetImage(index, #PB_EventType_LostFocus)
               EndIf
               
            Case #PB_EventType_LeftClick
               If \lastpressed = index
                  ;tue nix denn Button ist bereits gedrückt
               Else
                  If \lastpressed   ;könnte null sein, wenn bei Start keine Vorgabe
                     myButtonLeisteSetImage(\lastpressed, #PB_EventType_LostFocus)
                     \state(\lastpressed) = #PB_EventType_LostFocus
                  EndIf
                  myButtonLeisteSetImage(index, #PB_EventType_Focus)
                  \state(index) = #PB_EventType_Focus
                  \lastpressed = index
                  ProcedureReturn -index
               EndIf  
               
         EndSelect
                  
      EndIf
            
   EndWith
   
   ProcedureReturn wb
EndProcedure
Procedure.i myButtonLeiste(window, text.s, sp=0, ze=0, br=0, hh=0)   
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   Protected butbr, restbr
   
   With *i
      
      \window = window
      \anzGadget = CountString(text, "|") + 1
      
      Dim \pbnr(\anzGadget)
      Dim \text(\anzGadget)
      Dim \state(\anzGadget)
      
      For j = 1 To \anzGadget: \text(j) = StringField(text, j, "|"): Next
      
      If Not IsFont(\fontnr): myButtonLeisteSetFont(): EndIf      
      If \color[0]\crText = \color[0]\crBackground: myButtonLeisteSetColors(): EndIf
      
      If br = 0: br = WindowWidth(window) - sp: EndIf   
      butbr = br / \anzGadget 
      restbr = br - (\anzGadget * butbr) 
      
      If hh = 0
         StartDrawing(WindowOutput(\window))
            DrawingFont(FontID(\fontnr))
            hh = TextHeight("X") + 12
         StopDrawing()
      EndIf      
         
      For j = 1 To \anzGadget
         If j = \anzGadget: butbr + restbr: EndIf
         \pbnr(j) = CanvasGadget(#PB_Any, sp, ze, butbr, hh, #PB_Canvas_Border) ; |#PB_Canvas_DrawFocus
         sp + butbr
         SetGadgetAttribute(\pbnr(j), #PB_Canvas_Cursor, #PB_Cursor_Hand)
         \state(j) = #PB_EventType_LostFocus
         If \lastpressed And j = \lastpressed   ;falls vorm Erstellen der Buttonleiste
            \state(j) = #PB_EventType_Focus     ;SetButton aufgerufen wurde, dies berücksichtigen
         EndIf
         myButtonLeisteSetImage(j, \state(j))
      Next    
      
      ProcedureReturn hh
   EndWith
EndProcedure
Testprog

Code: Alles auswählen

XIncludeFile "ButtonLeiste.pbi"

OpenWindow(0, 100, 100, 727, 500 , "Canvas Buttons")

   TextGadget(1, 10, 100, 300, 100, "")
   
   myButtonLeisteSetButton(3)
   myButtonLeisteSetIcons(?LogoA, ?LogoB, ?LogoC)  
   myButtonLeiste(0, "Button1|Button2|Bugfytton3|Button4")  ;gibt Höhe der Buttonleiste zurück

Define event, welcherButton

Repeat
   
   event = WaitWindowEvent()
      
   Select event
      Case #PB_Event_Gadget
         
         welcherButton = EventGadget()
         
         ;ButtonleisteEvent gibt -1, -2 usw zurück wenn ein Button gedrückt wurde
         welcherButton = myButtonLeisteEvent(welcherButton)    
         
         Select welcherButton
            Case -1: SetGadgetText(1, "Button 1 gedrückt")
            Case -2: SetGadgetText(1, "Button 2 gedrückt")
            Case -3: SetGadgetText(1, "Button 3 gedrückt")
            Case -4: SetGadgetText(1, "Button 4 gedrückt")
                     myButtonLeisteSetToolTip(4, "text")
         EndSelect
         
   EndSelect
   
Until event = #PB_Event_CloseWindow
End 

DataSection   
  myButtonLeisteColors:        
  Data.i $091957 , $DDDCA1 , 0 ;Pressed ( Text, Background, effect )
  Data.i $000000 , $A0C0E8 , 1 ;Normal
  Data.i #Blue   , $82632D , 1 ;Mouse over
EndDataSection

DataSection   
   LogoA:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\play.ico"
   LogoB:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\stop.ico"
   LogoC:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\pause.ico"
EndDataSection
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Buttonleiste mit Canvasgadget

Beitrag von Derren »

Sieht gut aus.
Leider kann man es nicht resizen.
Signatur und so
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

Re: Buttonleiste mit Canvasgadget

Beitrag von Bisonte »

Doch... kann man... musst es nur selber hinzufügen ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Buttonleiste mit Canvasgadget

Beitrag von hjbremer »

Bisonte hat geschrieben:Doch... kann man... musst es nur selber hinzufügen ;)


hier mit Resizen, allerdings habe ich dafür die Eventverarbeitung etwas geändert. Darum den kompletten Code hier noch einmal

Frage ?
noch einmal
wird das zusammen geschrieben ???

die Include Datei

Code: Alles auswählen

;Canvas Toggle ButtonLeiste by HJ Bremer - PureBasic 4.61 Beta 1 x86

;Hinweis: sollte es einen Font mit der PbNr null bereits geben, dann wird er benutzt.
;         falls unerwünscht muß myButtonLeisteSetFont() aufgerufen werden.  

EnableExplicit

Structure myButtonLeiste
   window.i          ;myButtonLeiste gehört zu welchem Fenster
   fontnr.i          ;PB Fontnr, keine ID
   anzGadget.i       ;Anzahl Gadgets ab 1 gezählt
   lastpressed.i     ;zuletzt gedrückter Button
   Array pbnr.i(0)   ;PB-Nummern
   Array text.s(0)   ;zugehöriger Text
   Array state.i(0)  ;Status gedrückt, normal, Mouse over
   icons.i[3]           ;Icons 0 - 2, für jeden Status eins
   color.COMPCOLOR[3]   ;Farben 0 bis 2 für jeden Status
EndStructure

Procedure.i myButtonLeisteMemory()
   
   ;diese Prozedur ersetzt das ständige Übergeben von Parametern oder
   ;globale bzw. shared Variablen, indem es einen eigenen Memoryblock 
   ;reserviert. Jede der folgenden Prozeduren muß myButtonLeisteMemory 
   ;aufrufen um Zugriff zu haben.
   
   Static myMemory
   
   If Not myMemory 
      myMemory = AllocateMemory(SizeOf(myButtonLeiste))
   EndIf
   
   ProcedureReturn myMemory
EndProcedure
Procedure.i myButtonLeisteSetImage(index, state)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   With *i
      
      Protected cvgbr = GadgetWidth(\pbnr(index))
      Protected cvghh = GadgetHeight(\pbnr(index))
      
      Protected j, k, imgsp, imgze, imghh, txtsp, txtze, txtbr, txthh
      
      Select state
         Case #PB_EventType_Focus      : j = 0
         Case #PB_EventType_LostFocus  : j = 1
         Case #PB_EventType_MouseEnter : j = 2
      EndSelect
      
      Protected textcolor = \color[j]\crText
      Protected boxcolor  = \color[j]\crBackground
      Protected effects   = \color[j]\dwEffects
      
      StartDrawing(CanvasOutput(\pbnr(index)))
         ;Hintergrund
         DrawingMode(#PB_2DDrawing_Gradient) 
         FrontColor(boxcolor)
         BackColor($FAFAFA)      
         LinearGradient(cvgbr/2, 0, cvgbr/2, cvghh)
         If effects: LinearGradient(15, 5, cvgbr * 2, cvghh): EndIf
         Box(0, 0, cvgbr, cvghh)
         ;Image, möglichst ein Icon
         For k = 0 To 2
            If j = k And \icons[k]
               imghh = ImageHeight(\icons[k])
               If imghh + 12 > cvghh: imghh = cvghh - 12: EndIf
               imgsp = 5
               imgze = (cvghh - imghh - 4) / 2 
               DrawImage(ImageID(\icons[k]), imgsp, imgze, imghh, imghh)
            EndIf
         Next
         ;Text
         DrawingMode(#PB_2DDrawing_Transparent)
         DrawingFont(FontID(\fontnr))
         FrontColor(textcolor)
         txtbr = TextWidth(\text(index))
         txthh = TextHeight(\text(index))
         txtsp = (cvgbr - txtbr) / 2
         txtze = (cvghh - txthh) / 2
         DrawText(txtsp, txtze - 2, \text(index))         
      StopDrawing()
      
   EndWith  
EndProcedure
Procedure.i myButtonLeisteSetIcons(a, b, c = 0)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter a,b,c sind Adressen auf ein Label in einer DataSection
   ;Procedure sollte vor myButtonLeiste() aufgerufen werden
   ;hinterher ist auch möglich, aber nur einmal
   
   Static flag   
   If Not flag
      flag = 1
      If a: *i\icons[0] = CatchImage(#PB_Any, a): EndIf
      If b: *i\icons[1] = CatchImage(#PB_Any, b): EndIf
      If c: *i\icons[2] = CatchImage(#PB_Any, c): EndIf
      For j = 1 To *i\anzGadget
         If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf      
      Next
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteSetColors(*p.integer = 0)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: *p = Adresse der Datasection oder eines Array
   ;Procedure sollte vor myButtonLeiste() aufgerufen um Farben festzulegen
   ;Procedure kann auch nach myButtonLeiste() aufgerufen um Farben zu ändern
      
   If *p = 0: *p = ?myButtonLeisteColorsIntern: EndIf      
   
   For j = 0 To 2
      *i\color[j]\crText       = *p\i: *p + SizeOf(integer)
      *i\color[j]\crBackground = *p\i: *p + SizeOf(integer)
      *i\color[j]\dwEffects    = *p\i: *p + SizeOf(integer)
   Next
   
   For j = 1 To *i\anzGadget
      If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf      
   Next
      
DataSection
  myButtonLeisteColorsIntern:
  Data.i #Black , #Green  , 1  ;Pressed
  Data.i #Black , $E0C5AC , 0  ;Normal
  Data.i #Blue  , $FF8270 , 0  ;Over
EndDataSection
   
EndProcedure
Procedure.i myButtonLeisteSetFont(fontnr = -1)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: fontnr ist eine Pbnr
   ;Procedure sollte vor myButtonLeiste() aufgerufen um einen Font festzulegen
   ;Procedure kann auch nach myButtonLeiste() aufgerufen um den Font zu ändern
   
   If Not IsFont(fontnr)
      fontnr = LoadFont(#PB_Any, "Arial", 12)
   EndIf   
   *i\fontnr = fontnr
   
   If IsFont(*i\fontnr) 
      For j = 1 To *i\anzGadget
         If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf
      Next
   EndIf      
   
   ProcedureReturn *i\fontnr
EndProcedure
Procedure.i myButtonLeisteSetButton(nr = 1)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: nr des Buttons der gedrückt werden soll
   ;Hinweis:   es wird kein Event erzeugt
   ;Procedure kann vor oder nach myButtonLeiste() aufgerufen werden
   
   If nr 
      If *i\anzGadget >= nr
         If *i\lastpressed
            *i\state(*i\lastpressed) = #PB_EventType_LostFocus
            myButtonLeisteSetImage(*i\lastpressed, #PB_EventType_LostFocus)
         EndIf
         *i\state(nr) = #PB_EventType_Focus
         myButtonLeisteSetImage(nr, *i\state(nr))
      EndIf   
      *i\lastpressed = nr
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteSetToolTip(nr, text.s)
   Protected *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;Parameter: nr des Buttons 
   ;Procedure kann nur nach myButtonLeiste() aufgerufen werden
   
   If nr 
      If *i\anzGadget >= nr
         If IsGadget(*i\pbnr(nr))
            GadgetToolTip(*i\pbnr(nr), text) 
         EndIf
      EndIf   
   EndIf
   
EndProcedure
Procedure.i myButtonLeisteResize()
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   With *i
      
      Protected sp = GadgetX(\pbnr(1))
      Protected br = WindowWidth(\window) - sp   
      Protected butbr = br / \anzGadget 
      Protected restbr = br - (\anzGadget * butbr) 
      
      For j = 1 To \anzGadget - 1
         ResizeGadget(\pbnr(j), sp, #PB_Ignore, butbr, #PB_Ignore)
         sp + butbr
      Next
      ResizeGadget(\pbnr(j), sp, #PB_Ignore, butbr + restbr, #PB_Ignore)
      
      For j = 1 To *i\anzGadget
         If IsGadget(*i\pbnr(j)): myButtonLeisteSetImage(j, *i\state(j)): EndIf
      Next
      
   EndWith      
EndProcedure

Procedure.i myButtonLeisteEvent(event)
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   ;gibt -1, -2 usw zurück wenn ein Button der Buttonleiste gedrückt wurde
   ;wird ein anderes Gadget gedrückt, dann dessen Pb Nr 
   ;sonst #PB_Ignore
   ;wird ein bereits gedrückter Button der Buttonleiste gedrückt, dann ebenfalls #PB_Ignore
      
   With *i
      
      If event = #PB_Event_SizeWindow
         myButtonLeisteResize()
         
      ElseIf event = #PB_Event_Gadget
         
         Protected index = 0, button = EventGadget()
         
         ;gehört das Gadget zur Buttonleiste ?
         For j = 1 To \anzGadget
            If \pbnr(j) = button: index = j: Break: EndIf 
         Next
         
         ;Gadget gehört zur Buttonleiste, wenn index wahr
         If index             
            
            Select EventType()
                  
               Case #PB_EventType_MouseEnter
                  myButtonLeisteSetImage(index, #PB_EventType_MouseEnter)
                  
               Case #PB_EventType_MouseLeave
                  If \state(index) = #PB_EventType_Focus
                     myButtonLeisteSetImage(index, #PB_EventType_Focus)
                  Else
                     myButtonLeisteSetImage(index, #PB_EventType_LostFocus)
                  EndIf
                  
               Case #PB_EventType_LeftClick
                  If \lastpressed = index
                     ;tue nix denn Button ist bereits gedrückt
                  Else
                     If \lastpressed   ;könnte null sein, wenn bei Start keine Vorgabe
                        myButtonLeisteSetImage(\lastpressed, #PB_EventType_LostFocus)
                        \state(\lastpressed) = #PB_EventType_LostFocus
                     EndIf
                     myButtonLeisteSetImage(index, #PB_EventType_Focus)
                     \state(index) = #PB_EventType_Focus
                     \lastpressed = index
                     ProcedureReturn -index                  
                  EndIf  
                  
            EndSelect
            
         Else
            ProcedureReturn button
         EndIf   
      EndIf
            
   EndWith
   
   ProcedureReturn #PB_Ignore
EndProcedure
Procedure.i myButtonLeiste(window, text.s, sp=0, ze=0, br=0, hh=0)   
   Protected j, *i.myButtonLeiste = myButtonLeisteMemory()
   
   Protected butbr, restbr
   
   With *i
      
      \window = window
      \anzGadget = CountString(text, "|") + 1
      
      Dim \pbnr(\anzGadget)
      Dim \text(\anzGadget)
      Dim \state(\anzGadget)
      
      For j = 1 To \anzGadget: \text(j) = StringField(text, j, "|"): Next
      
      If Not IsFont(\fontnr): myButtonLeisteSetFont(): EndIf      
      If \color[0]\crText = \color[0]\crBackground: myButtonLeisteSetColors(): EndIf
      
      If br = 0: br = WindowWidth(\window) - sp: EndIf   
      butbr = br / \anzGadget 
      restbr = br - (\anzGadget * butbr) 
      
      If hh = 0
         StartDrawing(WindowOutput(\window))
            DrawingFont(FontID(\fontnr))
            hh = TextHeight("X") + 12
         StopDrawing()
      EndIf      
         
      For j = 1 To \anzGadget
         If j = \anzGadget: butbr + restbr: EndIf
         \pbnr(j) = CanvasGadget(#PB_Any, sp, ze, butbr, hh, #PB_Canvas_Border) ; |#PB_Canvas_DrawFocus
         sp + butbr
         SetGadgetAttribute(\pbnr(j), #PB_Canvas_Cursor, #PB_Cursor_Hand)
         \state(j) = #PB_EventType_LostFocus
         If \lastpressed And j = \lastpressed   ;falls vorm Erstellen der Buttonleiste
            \state(j) = #PB_EventType_Focus     ;SetButton aufgerufen wurde, dies berücksichtigen
         EndIf
         myButtonLeisteSetImage(j, \state(j))
      Next    
      
      ProcedureReturn hh
   EndWith
EndProcedure
Test

Code: Alles auswählen

XIncludeFile "ButtonLeiste1.pbi"

OpenWindow(0, 100, 100, 727, 500 , "Canvas Buttons", #PB_Window_SizeGadget|#PB_Window_SystemMenu)

   TextGadget(1, 10, 100, 300, 30, "", #PB_Text_Border|#PB_Text_Center|#BS_CENTER) ;BS_Center nur Windows
   
   ButtonGadget(2, 10, 200, 99, 30, "Button 2")
   ButtonGadget(3, 10, 260, 99, 30, "Button 3")
   
   myButtonLeisteSetButton(3)
   myButtonLeisteSetIcons(?LogoA, ?LogoB, ?LogoC)  
   myButtonLeiste(0, "Button1|Button2|Bugfytton3|Button4")  ;gibt Höhe der Buttonleiste zurück

Define event, welcherbutton

Repeat
   
   event = WaitWindowEvent()
   welcherbutton = myButtonLeisteEvent(event)
      
   Select event
      Case #PB_Event_SizeWindow
         ;Resize alle anderen Gadgets
         
      Case #PB_Event_Gadget         
         
         Select welcherbutton
            Case -1: SetGadgetText(1, "ButtonLeiste Button 1 gedrückt")
                     SetGadgetColor(1, #PB_Gadget_BackColor, #Red)
               
            Case -2: SetGadgetText(1, "ButtonLeiste Button 2 gedrückt")
                     SetGadgetColor(1, #PB_Gadget_BackColor, #Green)
               
            Case -3: SetGadgetText(1, "ButtonLeiste Button 3 gedrückt")
                     SetGadgetColor(1, #PB_Gadget_BackColor, #Magenta)
               
            Case -4: SetGadgetText(1, "ButtonLeiste Button 4 gedrückt")
                     SetGadgetColor(1, #PB_Gadget_BackColor, #Yellow)
               
            ; alle anderen Gadgets         
            ;Case 2 : SetGadgetText(1, "Button 2 gedrückt")       
            ;         SetGadgetColor(1, #PB_Gadget_BackColor, $F0F0F0)
            ;Case 3 : SetGadgetText(1, "Button 3 gedrückt")       
            ;         SetGadgetColor(1, #PB_Gadget_BackColor, $F0F0F0)
               
         EndSelect
         
         ;oder wers so lieber mag für die anderen Gadgets
         Select EventGadget()
            Case 2 : SetGadgetText(1, "Button 2 gedrückt")       
                     SetGadgetColor(1, #PB_Gadget_BackColor, $F0F0F0)
                     myButtonLeisteSetColors()
            Case 3 : SetGadgetText(1, "Button 3 gedrückt")       
                     SetGadgetColor(1, #PB_Gadget_BackColor, $F0F0F0)
                     myButtonLeisteSetColors(?myButtonLeisteColors)
         EndSelect
         
   EndSelect
   
Until event = #PB_Event_CloseWindow
End 

; falls im HauptProgramm die Farben definiert werden sollen
; mit myButtonLeisteSetColors(?myButtonLeisteColors)
DataSection   
  myButtonLeisteColors:        
  Data.i $091957 , $DDDCA1 , 0 ;Pressed ( Text, Background, effect )
  Data.i $000000 , $A0C0E8 , 1 ;Normal
  Data.i #Blue   , $82632D , 1 ;Mouse over
EndDataSection

DataSection   
   LogoA:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\play.ico"
   LogoB:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\stop.ico"
   LogoC:  IncludeBinary #PB_Compiler_Home + "Examples\Sources - Advanced\MoviePlayer\Icons\pause.ico"
EndDataSection
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten