Unter Windows geht es aus Thread direkt auf ein CanvasGadget zu zeichnen. Unter Linux auch, aber weiss nicht ob es zu einem Problem führen kann.
Unter MacOS kann man nicht aus einen Thread auf das CanvasGadget zeichnen.
Dieses funktioniert nur über dem Umweg mit einem PostEvent, damit das zeichnen im MainScope durchgeführt wird.
Code: Alles auswählen
;-TOP
Procedure Drawing1(Gadget)
Protected.d dx, dy, angle, center_x, center_y, delta_y
If IsGadget(Gadget) And GadgetType(Gadget) = #PB_GadgetType_Canvas
dx = GadgetWidth(Gadget)
dy = GadgetHeight(gadget)
angle = GetGadgetData(Gadget)
If StartVectorDrawing(CanvasVectorOutput(Gadget))
;Debug "Draw"
; Hintergrund
AddPathBox(0.0, 0.0, dx, dy)
VectorSourceColor(#Yellow | $FF000000)
FillPath()
; Rahmen
AddPathBox(0.0, 0.0, dx, dy)
VectorSourceColor(#Gray | $FF000000)
StrokePath(4.0)
center_x = dx * 0.5
center_y = dy * 0.5
If dy > dx
delta_y = dx * 0.9
Else
delta_y = dy * 0.9
EndIf
ResetCoordinates()
RotateCoordinates(center_x, center_y, angle)
AddPathCircle(center_x, delta_y, 10.0)
VectorSourceColor(#Red | $FF000000)
FillPath()
angle + 15.0
SetGadgetData(Gadget, angle)
StopVectorDrawing()
EndIf
EndIf
EndProcedure
Procedure evDrawing1()
Drawing1(EventGadget())
EndProcedure
Procedure thDrawing1(Gadget)
Repeat
Delay(100)
If IsGadget(Gadget)
PostEvent(#PB_Event_Gadget, 0, Gadget, #PB_EventType_Change)
;Drawing1(Gadget)
Else
Break
EndIf
ForEver
EndProcedure
Procedure thDrawing2(Gadget)
Repeat
Delay(100)
If IsGadget(Gadget)
PostEvent(#PB_Event_Gadget, 0, Gadget, #PB_EventType_Change)
;Drawing1(Gadget)
Else
Break
EndIf
ForEver
EndProcedure
If OpenWindow(0, 0, 0, 440, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 10, 10, 200, 200)
CanvasGadget(1, 230, 10, 200, 200)
BindGadgetEvent(0, @evDrawing1(), #PB_EventType_Change)
BindGadgetEvent(1, @evDrawing1(), #PB_EventType_Change)
CreateThread(@thDrawing1(), 0)
;Delay(50)
CreateThread(@thDrawing2(), 1)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf