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
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