Buttonleiste mit Canvasgadget
Verfasst: 12.01.2012 19:12
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
Testprog
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