es ist simpel und klein (200 Zeilen) und läßt sich leicht erweitern, finde ich.
die flags #PB_Button_MultiLine + _Default gibts nicht, Multiline wird aber im Text mit #LF$ oder | gemacht
das Toggleflag wird unterstützt mit minimaler Unterstützung, aber PB ist auch nicht besser.
Der wichtigste Unterschied ist das muß von Eventtype() in der Eventschleife.
Das Modul abspeichern z.B. als IButton1.pbi, anschließend folgt ein kleines Demoprog
Code: Alles auswählen
DeclareModule IButtonGadget
;HJBremer Windows 10 - ab PB 5.41 x86 + 5.70 x64 - 25.05.2019 V.1.15
Declare.i IButtonGadget(pbnr, x, y, br, hh, text$, flag=0) ;flags: #PB_Button_Toggle, _Left, _Right
;die flags #PB_Button_MultiLine + _Default gibts nicht, Multiline wird aber im Text mit #LF$ oder | gemacht
Declare.i IButtonSetColor(pbnr, oben, unten, text=#PB_Ignore, flag=1) ;flag=2 für MouseHover
Declare.i IButtonCopyColor(pbnr, ziel) ;kopiert Farben
Declare.s IButtonGetText(pbnr) ;holt Text
Declare.i IButtonSetText(pbnr, text$, flag=1) ;ändert den Text mit Draw
Declare.i IButtonSetText2(pbnr, text$, flag=0) ;ändert Zusatztext, flag=1 dann Draw
Declare.i IButtonSetFont(pbnr, fontid) ;ändert den Font
Declare.i IButtonState(pbnr) ;ToggleState 0 oder 1
Declare.i IButtonDraw(pbnr, colorOben, colorUnten, colortext, colorborder) ; in der Regel nur Intern
Structure IButton ;in der Regel nur Intern
br.i ;Breite Canvas, für IButtonDraw()
hh.i ;Höhe
toggle.i ;erhält den Wert 4096 bei Zuweisung und wenn Button gedrückt plus 1 also 4097
cBorderAussen.i ;Rahmen immer schwarz (in IButtonGadget ändern)
cBorderNormal.i ;Rahmen innen
cBorderHover.i ;Rahmen innen
cTextNormal.i ;Text
cTextHover.i
gcObenNormal.i ;GradientFarben
gcUntenNormal.i
gcObenHover.i
gcUntenHover.i
fontid.i
left.i ;Text nach links - ist flag und abstand zugleich
right.i ;Text nach rechts - ist flag und abstand
text.s ;Buttontext - mehrere Zeilen trennen mit #LF$ oder |
text2.s ;Zusatztext
EndStructure
#windowbkcolor = $F0F0F0 ;Window/Container-Farbe nur zur Info (Windows 10), auch GetSysColor_(#COLOR_3DFACE)
EndDeclareModule
Module IButtonGadget
EnableExplicit
Procedure.i IButtonDraw(pbnr, colorOben, colorUnten, colortext, colorborder)
Protected x, y, anz, j, thh, text$, t$, *ib.IButton = GetGadgetData(pbnr)
With *ib
StartDrawing(CanvasOutput(pbnr))
;Border
If \toggle & 1
Box(0, 0, \br, \hh, #Red) ; Box ev. durch DrawEdge_() ersetzen
Box(1, 1, \br-2, \hh-2, #Yellow)
Else
Box(0, 0, \br, \hh, \cBorderAussen) ; Fix, Vorgabe ist #Black
Box(1, 1, \br-2, \hh-2, colorBorder) ; Rahmen innen, cBorderNormal/cBorderHover
EndIf
;Buttoncolor
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(colorOben) ;colorOben
FrontColor(colorUnten) ;colorUnten
LinearGradient(0, 5, 0, \hh)
Box(2, 2, \br-4, \hh-4)
;Text + Font
DrawingMode(#PB_2DDrawing_Transparent)
If \fontid : DrawingFont(\fontid) : EndIf
text$ = \text + \text2
ReplaceString(text$, "|", #LF$, #PB_String_InPlace)
anz = CountString(text$, #LF$)
thh = TextHeight(text$)
y = (\hh - (thh * (anz+1))) / 2 ;1 - mehrzeilig, entspricht y = (\hh - thh) / 2
For j = 0 To anz
t$ = StringField(text$, j+1, #LF$)
x = (\br - TextWidth(t$)) / 2 ;CenterText
If \left : x = \left : EndIf
If \right : x = \br - TextWidth(t$) - \right : EndIf
DrawText(x, y, t$, colortext) : y + thh
Next
StopDrawing()
EndWith
EndProcedure
Procedure.s IButtonGetText(pbnr)
Protected *ib.IButton = GetGadgetData(pbnr)
ProcedureReturn *ib\text
EndProcedure
Procedure.i IButtonSetFont(pbnr, fontid)
Protected *ib.IButton = GetGadgetData(pbnr)
*ib\fontid = fontid
IButtonDraw(pbnr, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, *ib\cBorderNormal)
EndProcedure
Procedure.i IButtonSetText(pbnr, text$, flag=1)
Protected *ib.IButton = GetGadgetData(pbnr)
*ib\text = text$
If flag: IButtonDraw(pbnr, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, *ib\cBorderNormal): EndIf
EndProcedure
Procedure.i IButtonSetText2(pbnr, text$, flag=0)
Protected *ib.IButton = GetGadgetData(pbnr)
*ib\text2 = text$
If flag: IButtonDraw(pbnr, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, *ib\cBorderNormal): EndIf
EndProcedure
Procedure.i IButtonSetColor(pbnr, oben, unten, text=#PB_Ignore, flag=1)
Protected *ib.IButton = GetGadgetData(pbnr)
Select flag
Case #COLOR_GRADIENTINACTIVECAPTION, #PB_Gadget_FrontColor, 1 ; 3 Möglichkeiten zum aussuchen
If oben <> #PB_Ignore : *ib\gcObenNormal = oben : EndIf
If unten <> #PB_Ignore: *ib\gcUntenNormal = unten : EndIf
If text <> #PB_Ignore : *ib\cTextNormal = text : EndIf
Case #COLOR_GRADIENTACTIVECAPTION, #PB_Gadget_BackColor, 2
If oben <> #PB_Ignore : *ib\gcObenHover = oben : EndIf
If unten <> #PB_Ignore: *ib\gcUntenHover = unten : EndIf
If text <> #PB_Ignore : *ib\cTextHover = text : EndIf
Case #COLOR_BTNFACE, #PB_Gadget_LineColor, 3
If oben <> #PB_Ignore : *ib\cBorderNormal = oben : EndIf
If unten <> #PB_Ignore: *ib\cBorderHover = unten : EndIf
If text <> #PB_Ignore : *ib\cBorderAussen = text : EndIf
EndSelect
IButtonDraw(pbnr, *ib\gcObenHover, *ib\gcUntenHover, *ib\cTextHover, *ib\cBorderHover)
IButtonDraw(pbnr, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, *ib\cBorderNormal)
EndProcedure
Procedure.i IButtonCopyColor(pbnr, ziel)
Protected *ib.IButton = GetGadgetData(pbnr)
IButtonSetColor(ziel, *ib\gcObenHover, *ib\gcUntenHover, *ib\cTextHover, #PB_Gadget_BackColor)
IButtonSetColor(ziel, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, #PB_Gadget_FrontColor)
IButtonSetColor(ziel, *ib\cBorderNormal, *ib\cBorderHover, *ib\cBorderAussen, #PB_Gadget_LineColor)
EndProcedure
Procedure.i IButtonState(pbnr)
Protected *ib.IButton = GetGadgetData(pbnr)
ProcedureReturn *ib\toggle & 1
EndProcedure
Procedure.i IButtonEvent()
Protected pbnr = EventGadget(), *ib.IButton = GetGadgetData(pbnr)
Select EventType()
Case #PB_EventType_MouseEnter
IButtonDraw(pbnr, *ib\gcObenHover, *ib\gcUntenHover, *ib\cTextHover, *ib\cBorderHover)
Case #PB_EventType_MouseLeave
IButtonDraw(pbnr, *ib\gcObenNormal, *ib\gcUntenNormal, *ib\cTextNormal, *ib\cBorderNormal)
Case #PB_EventType_LeftClick
If *ib\toggle & 4096 : *ib\toggle ! 1 : EndIf ;ergibt 4096 bzw 4097
IButtonDraw(pbnr, *ib\gcObenHover, *ib\gcUntenHover, *ib\cTextHover, *ib\cBorderHover)
EndSelect
EndProcedure
Procedure.i IButtonGadget(pbnr, x, y, br, hh, text$, flag=0)
Protected rg, *ib.IButton = AllocateMemory(SizeOf(IButton))
With *ib
\br = br
\hh = hh
\text = text$
\cBorderAussen = #Black
\cBorderNormal = $F0F0F0 ;#white oder #gray
\cBorderHover = $FFFF00 ;#white oder #yellow
\cTextNormal = #Black
\cTextHover = #Blue
\gcObenHover = #White
\gcUntenHover = #Gray
\gcObenNormal = #White
\gcUntenNormal = $999999
If flag & #PB_Button_Left = #PB_Button_Left : \left = 5: EndIf ;256
If flag & #PB_Button_Right = #PB_Button_Right : \right = 5 : EndIf ;512
If flag & #PB_Button_Toggle = #PB_Button_Toggle : \toggle = 4096 : EndIf ;ist 4099
rg = CanvasGadget(pbnr, x, y, br, hh)
If pbnr = #PB_Any : pbnr = rg : EndIf
SetGadgetData(pbnr, *ib)
BindGadgetEvent(pbnr, @IButtonEvent(), #PB_EventType_MouseEnter)
BindGadgetEvent(pbnr, @IButtonEvent(), #PB_EventType_MouseLeave)
BindGadgetEvent(pbnr, @IButtonEvent(), #PB_EventType_LeftClick)
IButtonDraw(pbnr, \gcObenNormal, \gcUntenNormal, \cTextNormal, \cBorderNormal)
EndWith
ProcedureReturn rg
EndProcedure
EndModule
UseModule IButtonGadget
Code: Alles auswählen
XIncludeFile "IButton1.pbi"
EnableExplicit
Enumeration
#Window : #font
#IButton1 : #IButton2 : #IButton3 : #IButton4
#IButton5 : #IButton6 : #IButton7 : #IButton8
#IButton9 : #IButton10 :
EndEnumeration
LoadFont(#font, "Consolas", 9)
Define event, pbnr10, text$, nr, jahr = 2019
OpenWindow(#Window, 0, 0, 500, 300, "Canvas Buttons",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
IButtonGadget(#IButton1, 10, 10, 120, 28, "Button 1")
IButtonGadget(#IButton2, 10, 50, 120, 34, "Button 2", #PB_Button_Toggle|#PB_Button_Left)
IButtonSetColor(#IButton2, $86E0FF, $1379C4, #Blue, #PB_Gadget_FrontColor)
IButtonSetColor(#IButton2, #White, $D24321, #Red, #PB_Gadget_BackColor)
IButtonGadget(#IButton3, 10, 99, 120, 44, "Button 3|mit 2 Zeilen", #PB_Button_Right)
IButtonGadget(#IButton4, 10, 170, 120, 26, "Jahr ändern ->")
IButtonSetFont(#IButton4, FontID(#font))
IButtonSetColor(#IButton4, #Yellow, #Green, #Magenta)
IButtonGadget(#IButton5, 150, 10, 120, 28, "Button 5 State ?")
IButtonGadget(#IButton6, 150, 50, 120, 34, "Toggle Button", #PB_Button_Toggle)
IButtonGadget(#IButton7, 150, 99, 150, 64, "")
IButtonSetText(#IButton7, "Button 7|drück mich")
IButtonGadget(#IButton8, 150, 170, 150, 44, "im Jahre ")
IButtonSetText2(#IButton8, Str(jahr), 1)
IButtonSetColor(#IButton5, #PB_Ignore, #PB_Ignore, #Blue,1)
IButtonSetColor(#IButton5, #PB_Ignore, #PB_Ignore, #Red, 2)
IButtonSetColor(#IButton5, #PB_Ignore, #Red, #PB_Ignore, 3)
IButtonSetColor(#IButton7, $F0F0F0, $F0F0F0, #Blue,1)
IButtonSetColor(#IButton7, $F0F0F0, $F0F0F0, #Red, 2)
IButtonSetColor(#IButton7, $F0F0F0, $F0F0F0, $F0F0F0,3)
IButtonGadget(#IButton9, 10, 230, 320, 34, "Eventype Abfrage vergessen: im Jahre ")
pbnr10 = IButtonGadget(#PB_Any, 400, 260, 90, 24, "Ende")
IButtonCopyColor(#IButton4, pbnr10)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #IButton1 To #IButton3
If EventType() = #PB_EventType_LeftClick ;Abfrage nie vergessen
Debug "Button Leftclick " + EventGadget()
EndIf
Case #IButton4
If EventType() = #PB_EventType_LeftClick
jahr + 1
IButtonSetText2(#IButton8, Str(jahr), 1) ;1=mit Redraw
EndIf
Case #IButton5
If EventType() = #PB_EventType_LeftClick
Debug "Toggle 2 " + IButtonState(#IButton2)
Debug "Toggle 6 " + IButtonState(#IButton6)
EndIf
Case #IButton6:
If EventType() = #PB_EventType_LeftClick
EndIf
Case #IButton7
If EventType() = #PB_EventType_LeftButtonDown
nr + 1
text$ = IButtonGetText(#IButton7)
text$ = StringField(text$, 1, #LF$) + #LF$ + "weiter so"
IButtonSetText(#IButton7, text$, 0) ;0=kein Redraw
IButtonSetText2(#IButton7, #LF$ + Str(nr) + " x gedrückt")
EndIf
Case #IButton8
If EventType() = #PB_EventType_LeftClick
jahr = 1355
IButtonSetText(#IButton8, "wieder im Jahre"+#LF$)
IButtonSetText2(#IButton8, Str(jahr), 1) ;1=mit Redraw
EndIf
Case #IButton9
jahr + 1
IButtonSetText2(#IButton9, Str(jahr))
Case pbnr10
If EventType() = #PB_EventType_LeftClick: Break: EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow