Code: Alles auswählen
;- Ein-Ausschalter ab PB 5.42 (x86) (x64) für Windows. Linux und MacOs sollte auch gehen.
;HJBremer - 12.2019 V.1.03, geschrieben unter Windows 10 mit PB 5.70 LTS (x64) oder (x86)
;
;Moveknop(pbnr, x, y, width, height, state=0, pbcolor=$f0f0f0)
; x, y, width, height: Gadgetposition und Größe
; state: Schalterstellung bei Start, 0 = aus, 1 = ein
; pbcolor: ParentBackColor ist bei Windows 10 Fenster + Container oft $f0f0f0, Panel = #white
; wenn mit SetWindowColor() + SetGadgetColor() geändert, muß pbcolor angegeben werden.
; PB hat keinen Befehl der dies erledigt. GetColor liefert erst wenn SetColor benutzt wurde.
;Moveknop_Value(pbnr, typ, wert) Aussehen des Knop: Style oder Speed oder Farben einstellen
; pbnr: Nummer um das Gadget zu identifizieren oder #PB_Default
; typ: #knopstyle
; wert: 0=normal, 1=Gradientfarbe mit einem Grauwert, 2=GradientColor mit 2 Grauwerten
; Gradientfarbe ist grau bis \colorknop
;
; typ: #speedloop + #speeddelay dient der Verzögerung um Bewegung zu simulieren
; wert: für loop ca 10-50, für delay ca 0-10
; typ: #colorframe für Rahmen, wenn kein Rahmen gewünscht auf parentbackcolor setzen z.B. $F0F0F0
; wert: RGB Farbwert
; typ: #colorring ist der äussere Rand des Knops
; typ: #colorback_on + #colorback_off ist Gadgetfarbe je für on/off
; typ: #colorknop_on + #colorknop_off ist Knopfarbe je für on/off
; typ: #colortext_on + #colortext_off ist Textfarbe je für on/off
; typ: #showinfo zeigt Textrahmen + pbnr + state, aber nur wenn Text mit SetText zugewiesen wurde.
;Moveknop_Free(pbnr) gibt Structure-Memory frei, wichtig für temporäre Gadgets
;Moveknop_GetState(pbnr) Schalterstellung abfragen ergibt 0 oder 1
;Moveknop_SetState(pbnr, wert) Schalterstellung setzen wert ist 0 oder 1
;Moveknop_SetText(pbnr, text$, texthh, textpos=0) Text + Textgröße setzen, Text im Knopf oder
; text$: Text für Schalterstellung z.B. "0,1", "on,off"
; texthh: Schriftgröße siehe auch Hilfe VectorFont()
; textpos: Textposition, 0 ist ausserhalb vom Knop, 1 ist im Knop
;Allgemein
; #PB_Any ist bei Moveknop_Value() erlaubt. Ändert die Voreinstellung
; #PB_Any ist bei Moveknop() erlaubt. Rückgabewert ist dann die PB Nr.
; In der MainEventschleife muß immer EventType() abgefragt werden !!!
; alle Farben sind RGB Werte in HEX, also BGR Reihenfolge. Alpha wird intern in Draw addiert.
DeclareModule MoveButton
Declare.i Moveknop(pbnr, x, y, width, height, state=0, pbcolor=$f0f0f0)
Declare.i Moveknop_Value(pbnr, typ, wert)
Declare.i Moveknop_Free (pbnr)
Declare.i Moveknop_GetState(pbnr)
Declare.i Moveknop_SetState(pbnr, state)
Declare.i Moveknop_SetText (pbnr, text$, texthh, textpos=0)
Enumeration
#showinfo
#knopstyle
#speedloop
#speeddelay
#colorframe
#colorring
#colorback_on
#colorback_off
#colorknop_on
#colorknop_off
#colortext_on
#colortext_off
EndEnumeration
EndDeclareModule
Module MoveButton
EnableExplicit
;- Structure
Structure moveknop
pbnr.i
width.d ;Gadget breite/höhe
height.d
xknop.d ;x+y = posi vom knop
yknop.d
knopgap.d ;Abstand Knopf von der Gadgetseite
framegap.d ;Abstand Rahmen vom Gadget
knopsize.d ;Knopf Durchmesser = 2 x Radius
knopradius.d ;vom Knopf
frameradius.d ;vom GadgetRahmen
parentbackcolor.i ;ParentFenster Backcolor
colorback.i ;intern GadgetBackColor
colorknop.i ;intern KnopfColor innen
colortext.i ;intern Textcolor
colorframe.i ;Rahmenfarbe
colorring.i ;KnopfColor aussen
colorback_on.i ;wenn eingeschaltet
colorback_off.i ;wenn aus
colorknop_on.i ;wenn eingeschaltet
colorknop_off.i ;wenn aus
colortext_on.i ;wenn eingeschaltet
colortext_off.i ;wenn aus
style.i ;wenn 1, dann #colorknop_on _off definieren, wobei off dunkler sein muß. $FFDD00 $FF6600
loop.i ;anzahl Aufrufe zum Zeichnen für Bewegung vom Knop
delay.i ;zusätzliche Verzögerung beim zeichnen
align.i ;Ausrichtung vertikal / horizontal
state.i ;off / on = 0 oder 1
push.i
info.i ;zeigt Textrahmen etc
texthh.i ;Texthöhe siehe Moveknop_Text(pbnr, text$, texthh)
textpos.i
text.s ;intern
text_on.s ;text$ für Moveknop_Text() = "on,off"
text_off.s
EndStructure
;- Default Color
Global default_info = 0
Global default_loop = 50
Global default_delay = 2
Global default_style = 0 ;
Global default_colorframe = #Gray
Global default_colorring = #Yellow ;knop aussen
Global default_colorback_on = $bababa ;hellgrau
Global default_colorback_off = $999999 ;dunkelgrau
Global default_colorknop_on = $11B5FF ;orange
Global default_colorknop_off = $666666 ;grau
Global default_colortext_on = #Red
Global default_colortext_off = #Black
Global default_font = LoadFont(#PB_Any, "Consolas", 10, #PB_Font_Bold)
;- intern
Procedure.i moveknop_DrawText(*mb.moveknop)
Protected.d x, y, textboxbr, textboxhh
With *mb
VectorFont(FontID(default_font), \texthh)
If \state
\text = \text_on: \colortext = \colortext_on
Else
\text = \text_off: \colortext = \colortext_off
EndIf
If \align ;Gadget senkrecht
textboxbr = \height - (\knopgap*2)
textboxhh = VectorParagraphHeight(\text, textboxbr, \height)
RotateCoordinates(\xknop, \yknop, 90) ;Text um Knop-Mittelpunkt drehen
If \textpos ;im Knop
x = \xknop - textboxbr/2
y = \yknop - textboxhh/2
Else ;ausserhalb vom Knop
x = \xknop - \knopradius
If \state
y = \yknop + \knopradius + \knopgap ;Text unter dem Knop
Else
y = \yknop - \knopradius - textboxhh - \knopgap ;Text über dem Knop
EndIf
EndIf
Else ;Gadget waagerecht
textboxbr = \width - \knopsize - (\knopgap*3)
textboxhh = VectorParagraphHeight(\text, textboxbr, \height)
y = \yknop - textboxhh/2
If \textpos ;im Knop
x = \xknop - textboxbr/2
Else ;ausserhalb vom Knop
If \state
x = \xknop - \knopradius - \knopgap - textboxbr
Else
x = \xknop + \knopradius + \knopgap
EndIf
EndIf
EndIf
VectorSourceColor($FF000000 | \colortext)
MovePathCursor(x, y) ;DrawVectorParagraph bietet oft bessere Schrift
DrawVectorParagraph(\text, textboxbr, textboxhh, #PB_VectorParagraph_Center)
;Test
If \info
VectorSourceColor($FF000000 | #Blue)
AddPathBox(x, y, textboxbr, textboxhh) : StrokePath(1)
ResetCoordinates()
MovePathCursor(6, 0)
DrawVectorParagraph(Str(\pbnr) + "-" + Str(\state), textboxbr+5, textboxhh)
EndIf
EndWith
EndProcedure
Procedure.i moveknop_DrawButton(*mb.moveknop)
Protected j, a = $FF000000 ;Alphawert wird Bitweise OR Color
With *mb
StartVectorDrawing(CanvasVectorOutput(\pbnr))
If \align ;Senkrecht
TranslateCoordinates(0, \width): RotateCoordinates(0, 0, 270)
EndIf
;Canvas komplett füllen bzw löschen mit \parentbackcolor
AddPathBox(0, 0, \width, \height) : VectorSourceColor(a | \parentbackcolor): FillPath()
;knop Background malen mit Rahmen + runden Ecken
Protected g = \framegap ;abstand Rahmen vom CanvasGadget
Protected h = \height-g-g
Protected w = \width-g-g
Protected r = \frameradius
MovePathCursor(g+r, g)
;Hilfe + Beispiel für AddPathArc() ist Grrrr...
AddPathArc(w-r , 0 , w-r , r , r, #PB_Path_Relative) ;oben
AddPathArc(0 , h-r , -r , h-r , r, #PB_Path_Relative) ;rechts
AddPathArc(-w+r, 0 , -w+r , -r , r, #PB_Path_Relative) ;unten
AddPathArc(0 , -h+r, r , -h+r, r, #PB_Path_Relative) ;links
VectorSourceColor(a | \colorframe) ;Rahmenfarbe
StrokePath(3, #PB_Path_Preserve) ;Dicke 3 oder so, Path bleibt offen für FillPath()
VectorSourceColor(a | \colorback)
FillPath()
;knop malen
AddPathCircle(\xknop, \yknop, \knopradius): VectorSourceColor(a | \colorring): FillPath()
If \style = 0
AddPathCircle(\xknop, \yknop, \knopradius-2): VectorSourceColor(a | #Gray): FillPath()
AddPathCircle(\xknop, \yknop, \knopradius-3): VectorSourceColor(a | \colorknop): FillPath()
Else
VectorSourceCircularGradient(\xknop, \yknop, \knopradius-2)
VectorSourceGradientColor($FFe6e6e6, 0.0)
If \style = 2
VectorSourceGradientColor($FF888888, 0.8)
EndIf
VectorSourceGradientColor(a | \colorknop, 1.0)
FillVectorOutput()
;damit es schöner aussieht
AddPathCircle(\xknop, \yknop, \knopradius-2): VectorSourceColor(a | \colorknop): StrokePath(1)
EndIf
;Text
If \texthh : moveknop_DrawText(*mb) : EndIf
StopVectorDrawing()
Delay(\delay)
EndWith
EndProcedure
Procedure.i moveknop_Press(*mb.moveknop)
Protected j, add.d
With *mb
If \state = 0
\state = 1
\xknop = \knopradius + \knopgap
Else
\state = 0
\xknop = \width - \knopradius - \knopgap
EndIf
add = ( \width - \xknop - \xknop) / \loop
;zeichnet knop mehrmals um Bewegung zu simulieren
For j = 1 To \loop
If \state = 1
If j > \loop/2
\colorback = \colorback_on
\colorknop = \colorknop_on
\colortext = \colortext_on
EndIf
Else
\colorback = \colorback_off
\colorknop = \colorknop_off
\colortext = \colortext_off
EndIf
\xknop + add
moveknop_DrawButton(*mb) ;: Debug \xknop
Next
EndWith
EndProcedure
Procedure.i moveknop_Event()
Protected *mb.moveknop = GetGadgetData(EventGadget())
If EventType() = #PB_EventType_LeftButtonDown ;Schalter
moveknop_Press(*mb)
ElseIf EventType() = #PB_EventType_LeftButtonUp ;Taster = normaler Button
If *mb\push = 1 And *mb\state = 1
moveknop_Press(*mb)
EndIf
EndIf
EndProcedure
Procedure.i moveknop_Check(pbnr)
Protected error, text$
If IsGadget(pbnr) = 0
error = 1: text$ = "unbekannte Gadgetnr: " + pbnr
ElseIf GadgetType(pbnr) <> #PB_GadgetType_Canvas
error = 2: text$ = "kein CanvasGadget: " + pbnr
ElseIf GetGadgetData(pbnr) = 0
error = 3: text$ = "kein MoveButton: " + pbnr
EndIf
If error: MessageRequester("Fehler", text$) : End : EndIf
ProcedureReturn GetGadgetData(pbnr)
EndProcedure
;- extern
Procedure.i Moveknop_Value(pbnr, typ, wert)
If pbnr = #PB_Default
Select typ
Case #showinfo: default_info = wert
Case #knopstyle: default_style = wert
Case #speedloop: default_loop = wert
Case #speeddelay: default_delay = wert
Case #colorframe: default_colorframe = wert
Case #colorring : default_colorring = wert
Case #colorback_on : default_colorback_on = wert
Case #colorback_off: default_colorback_off = wert
Case #colorknop_on : default_colorknop_on = wert
Case #colorknop_off: default_colorknop_off = wert
Case #colortext_on : default_colortext_on = wert
Case #colortext_off: default_colortext_off = wert
EndSelect
Else
Protected *mb.moveknop = moveknop_Check(pbnr)
With *mb
Select typ
Case #showinfo: \info = wert
Case #speedloop : \loop = wert
Case #speeddelay: \delay = wert
Case #knopstyle : \style = wert
Case #colorframe: \colorframe = wert
Case #colorring : \colorring = wert
Case #colorback_on
\colorback_on = wert : If \state = 1 : \colorback = wert : EndIf ;nur wenn on
Case #colorback_off
\colorback_off = wert : If \state = 0 : \colorback = wert : EndIf ;nur wenn off
Case #colorknop_on
\colorknop_on = wert : If \state = 1 : \colorknop = wert : EndIf
Case #colorknop_off
\colorknop_off = wert : If \state = 0 : \colorknop = wert : EndIf
Case #colortext_on
\colortext_on = wert : If \state = 1 : \colortext = wert : EndIf
Case #colortext_off
\colortext_off = wert : If \state = 0 : \colortext = wert : EndIf
EndSelect
moveknop_DrawButton(*mb)
EndWith
EndIf
EndProcedure
Procedure.i Moveknop_Free(pbnr)
Protected *mb.moveknop = moveknop_Check(pbnr)
FreeStructure(*mb)
FreeGadget(pbnr)
EndProcedure
Procedure.i Moveknop_GetState(pbnr)
Protected *mb.moveknop = moveknop_Check(pbnr)
ProcedureReturn *mb\state
EndProcedure
Procedure.i Moveknop_SetState(pbnr, state)
Protected *mb.moveknop = moveknop_Check(pbnr)
If *mb\state <> state
PostEvent(#PB_Event_Gadget, EventWindow(), pbnr, #PB_EventType_LeftButtonDown)
EndIf
EndProcedure
Procedure.i Moveknop_SetText(pbnr, text$, texthh, textpos=0)
Protected *mb.moveknop = moveknop_Check(pbnr)
*mb\texthh = texthh
*mb\textpos = textpos
*mb\text_on = StringField(text$, 1, ",")
*mb\text_off = StringField(text$, 2, ",")
moveknop_DrawButton(*mb)
EndProcedure
Procedure.i Moveknop(pbnr, x, y, width, height, state=0, pbcolor=$f0f0f0)
Protected id, *mb.moveknop = AllocateStructure(moveknop)
id = CanvasGadget(pbnr, x, y, width, height)
If pbnr = #PB_Any : pbnr = id : EndIf
With *mb
If width > height
\align = 0 ;knop waagerecht
\width = width
\height = height
Else
\align = 1 ;knop senkrecht
\width = height
\height = width
EndIf
\pbnr = pbnr
\state = state ;on/off = 0 oder 1
If state = 2
\state = 0 : \push = 1
EndIf
\parentbackcolor = pbcolor ;Windows 10 + Container = f0f0f0, Panel = #white
\info = default_info ;Textrahmen + pbnr + state anzeigen
\colorframe = default_colorframe ;Rahmen
\colorring = default_colorring ;knop aussen
\colorknop_on = default_colorknop_on ;Farben
\colorknop_off = default_colorknop_off
\colorback_on = default_colorback_on
\colorback_off = default_colorback_off
\colortext_on = default_colortext_on
\colortext_off = default_colortext_off
\loop = default_loop ;Anzahl Aufrufe von StartDawing() für Bewegung vom Knop
\delay = default_delay ;zusätzliche Verzögerung, für loop ab 10, delay ca 2
\style = default_style ;
\framegap = 2 ; Abstand Rahmen vom CanvasGadget
\frameradius = 10 ; Rundung Rahmen
\knopgap = 6 ; Abstand Knop vonn CanvasGadgetrand
\knopsize = \height - 12 ; Knopdurchmesser = minus 2 x Gap
\knopradius = \knopsize / 2 ; KnopRadius
\yknop = \height /2 ; Mittelpunkt des Kreises
If \state = 0 ;Aus
\xknop = \knopradius + \knopgap
\colorback = \colorback_off
\colorknop = \colorknop_off
Else
\xknop = \width - \knopradius - \knopgap
\colorback = \colorback_on
\colorknop = \colorknop_on
EndIf
EndWith
SetGadgetData(pbnr, *mb)
SetGadgetAttribute(pbnr, #PB_Canvas_Cursor, #PB_Cursor_Hand)
BindGadgetEvent(pbnr, @moveknop_Event(), #PB_EventType_LeftButtonDown)
BindGadgetEvent(pbnr, @moveknop_Event(), #PB_EventType_LeftButtonUp)
moveknop_DrawButton(*mb)
ProcedureReturn id
EndProcedure
EndModule
UseModule MoveButton
CompilerIf #PB_Compiler_IsMainFile
Enumeration
#moveknop1 = 1
#moveknop2
#moveknop3
#moveknop4
#moveknop10 = 10
#moveknop11
#moveknop12
#moveknop13
#moveknop20 = 20
#moveknop21
#container
#panel
#text
EndEnumeration
;- Main
Define event, nr, winflags = #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_ScreenCentered
If OpenWindow(0, 0, 0, 520, 480, "Moveknop example", winflags)
Moveknop_Value(#PB_Default, #showinfo, 0)
Moveknop_Value(#PB_Default, #colorframe, #Black)
Moveknop(#moveknop1, 11, 11, 60, 32)
Moveknop(#moveknop2, 11, 75, 60, 100, 1)
Moveknop(#moveknop3, 88, 75, 170, 70, 1)
Moveknop(#moveknop4, 300, 80, 50, 50, 2)
Moveknop_Value(#moveknop2, #knopstyle, 1)
Moveknop_Value(#moveknop3, #knopstyle, 1)
Moveknop_Value(#moveknop4, #knopstyle, 2)
Moveknop_Value(#moveknop4, #colorring, $5C5C5C)
Moveknop_Value(#moveknop4, #colorknop_on, #Red)
Moveknop_Value(#moveknop4, #colorknop_off, #Gray)
Moveknop_SetText(#moveknop1, "on,off", 12)
Moveknop_SetText(#moveknop2, "on,off", 18, 1)
Moveknop_SetText(#moveknop3, "Heizung ein,Ofen aus", 18)
ContainerGadget(#container, 10, 222, 222, 222, #PB_Container_Flat)
Moveknop(#moveknop10, 10, 15, 100, 60)
Moveknop_Value(#moveknop10, #knopstyle, 2)
Moveknop_Value(#moveknop10, #colorring, $5C5C5C)
Moveknop_Value(#moveknop10, #colorknop_on, #Green)
Moveknop_Value(#moveknop10, #colorknop_off, #Red)
Moveknop_SetText(#moveknop10, "on,off", 14, 1)
Moveknop(#moveknop11, 120, 15, 60, 100, 1)
Moveknop_SetText(#moveknop11, "on,off", 14, 1)
Moveknop(#moveknop12, 10, 90, 60, 100, 1)
Moveknop_SetText(#moveknop12, "ein,aus", 14, 0)
Moveknop(#moveknop13, 80, 130, 110, 60, 1)
Moveknop_SetText(#moveknop13, "Open,Close", 15, 0)
CloseGadgetList()
PanelGadget(#panel, 240, 222, 222, 222)
AddGadgetItem (#panel, -1, "Panel 1")
Moveknop(#moveknop20, 10, 15, 36, 60, 1, #White)
Moveknop_SetText(#moveknop20, "on,off", 12)
AddGadgetItem (#panel, -1, "Panel 2")
TextGadget(#text, 2, 2, 230, 192, "")
SetGadgetColor(#text, #PB_Gadget_BackColor, #Green)
Moveknop(#moveknop21, 10, 15, 48, 100, 0, #Green)
CloseGadgetList()
HideWindow(0, 0)
;- Repeat
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #moveknop1
If EventType() = #PB_EventType_LeftButtonDown
;diese EventType() Abfrage muß sein !!!!
If Moveknop_GetState(#moveknop1)
Moveknop_Value(#moveknop3, #colorframe, #Black)
Moveknop_Value(#moveknop3, #colorback_on, #Green)
Moveknop_Value(#moveknop3, #colorback_off, #Magenta)
Moveknop_Value(#moveknop3, #colortext_off, #Black)
Moveknop_Value(#moveknop3, #colortext_on, #Blue)
Moveknop_Value(#moveknop3, #speedloop, 25)
Moveknop_Value(#moveknop10, #colorring, $654321)
Moveknop_Value(#moveknop10, #colorknop_on, #Yellow)
Moveknop_Value(#moveknop10, #colorknop_off, #Red)
Moveknop_Value(#moveknop10, #colorback_on, $11B5FF)
Moveknop_Value(#moveknop10, #colorframe, $444444)
EndIf
EndIf
Case #moveknop2
If EventType() = #PB_EventType_LeftButtonDown
Moveknop_SetText(#moveknop3, "Heizung läuft,Heizung aus", 18)
EndIf
Case #moveknop4
If EventType() = #PB_EventType_LeftButtonDown
Moveknop_SetText(#moveknop3, "Wasser läuft,Ofen aus", 18)
Moveknop_SetState(#moveknop3, 0)
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
CompilerEndIf