Wow, super, great code

It's very fluid and flicker-free, thanks for sharing.
I've added some specific code, workaround for ExplorerComboGadget and ComboBoxGadget, not properly captured.
With also a SpinGadget that needs a Container
Code:
Structure canvasitem
img.i
x.i
y.i
width.i
height.i
EndStructure
Global isCurrentItem = #False
Global currentItemXOffset.i, currentItemYOffset.i
Global NewList Images.canvasitem()
Global DriveImage = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\Drive.bmp")
Procedure AddImage(x,y,img)
If AddElement(Images())
Images()\img = img
Images()\x = x
Images()\y = y
Images()\width = ImageWidth(img)
Images()\height = ImageHeight(img)
EndIf
EndProcedure
Procedure DrawCanvas()
If StartDrawing(CanvasOutput(0))
Box(0,0,GadgetWidth(0),GadgetHeight(0),RGB(255,255,255))
ForEach Images()
DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ; draw all images with z-order
Next
With Images()
If Not Drag
;Gadget Outline #Blue
DrawingMode(#PB_2DDrawing_Outlined)
Box(\x, \y, \Width, \Height, #Blue)
;Inside Handles #White
DrawingMode(#PB_2DDrawing_Default)
Box(\x-3, \y-3, 6, 6, #White)
Box(\x+\Width-3, \y-3, 6, 6, #White)
Box(\x+\Width-3, \y+\Height-3, 6, 6, #White)
Box(\x-3, \y+\Height-3, 6, 6, #White)
;Outside Handles #Blue
DrawingMode(#PB_2DDrawing_Outlined)
Box(\x-4, \y-4, 8, 8, #Blue)
Box(\x+\Width-4, \y-4, 8, 8, #Blue)
Box(\x+\Width-4, \y+\Height-4, 8, 8, #Blue)
Box(\x-4, \y+\Height-4, 8, 8, #Blue)
; ;Original Handles Full #Blue
; DrawingMode(#PB_2DDrawing_Outlined)
; Box(\x, \y, \Width, \Height, #Blue)
; DrawingMode(#PB_2DDrawing_Default)
; Box(\x-4, \y-4, 8, 8, #Blue)
; Box(\x+\Width-4, \y-4, 8, 8, #Blue)
; Box(\x+\Width-4, \y+\Height-4, 8, 8, #Blue)
; Box(\x-4, \y+\Height-4, 8, 8, #Blue)
Else
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(\x, \y, \Width, \Height, RGBA($42, $42, $42, $50))
DrawImage(ImageID(\img), \x, \y, \Width, \Height)
EndIf
EndWith
StopDrawing()
EndIf
EndProcedure
Procedure HitTest(x,y)
isCurrentItem = #False
If LastElement(Images()) ; search for hit, starting from end (z-order)
Repeat
If x >= Images()\x And x < Images()\x + Images()\width
If y >= Images()\y And y < Images()\y + Images()\height
MoveElement(Images(), #PB_List_Last)
isCurrentItem = #True
currentItemXOffset = x - Images()\x
currentItemYOffset = y - Images()\y
Break
EndIf
EndIf
Until PreviousElement(Images())=0
EndIf
ProcedureReturn isCurrentItem
EndProcedure
Procedure CaptureGadget(Gadget)
Protected Img,hdc,SizeTextH
Img = CreateImage(#PB_Any,GadgetWidth(Gadget),GadgetHeight(Gadget))
If IsGadget(Gadget)
hdc = StartDrawing(ImageOutput(Img))
If hdc
SendMessage_(GadgetID(Gadget),#WM_PRINT,hDC, #PRF_CHILDREN|#PRF_CLIENT|#PRF_NONCLIENT|#PRF_OWNED|#PRF_ERASEBKGND)
If GadgetType(Gadget) = 8 ;Specific ComboBoxGadget
DrawingFont(GetGadgetFont(#PB_Default))
DrawingMode(#PB_2DDrawing_Transparent)
SizeTextH = TextHeight("Text")
DrawText(4, (OutputHeight()-SizeTextH)/2, "Element_1", $000000)
EndIf
If GadgetType(Gadget) = 25 ;Specific ExplorerComboGadget
DrawingFont(GetGadgetFont(#PB_Default))
DrawingMode(#PB_2DDrawing_Transparent)
DrawImage(ImageID(DriveImage), 4, (OutputHeight()-ImageHeight(DriveImage))/2)
SizeTextH = TextHeight("Text")
DrawText(8+ImageWidth(DriveImage), (OutputHeight()-SizeTextH)/2, "This PC", $000000)
EndIf
StopDrawing()
EndIf
EndIf
ProcedureReturn Img
EndProcedure
If OpenWindow(0, 0, 0, 800, 600, "Move/Drag Canvas Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 10, 10, 780, 580,#PB_Canvas_Container)
ButtonGadget(1,0,0,100,30,"Button") : HideGadget(1,1)
CalendarGadget(2,0,0,220,160) : HideGadget(2,1)
ExplorerListGadget(3, 0, 0, 380, 180, "*.*", #PB_Explorer_MultiSelect) : HideGadget(3,1)
PanelGadget(4,0,0,200,100) : HideGadget(4,1)
AddGadgetItem(4,-1,"Tab 1")
TextGadget(40,20,20,120,24, "My Text")
AddGadgetItem(4,-1,"Tab 2")
CloseGadgetList()
ScrollAreaGadget(5,0,0,280,180,400,300) : HideGadget(5,1)
CheckBoxGadget(50, 20, 20, 120, 24, "CheckBox")
CloseGadgetList()
ExplorerComboGadget(6,0,0,120,24, "C:") : HideGadget(6,1)
ComboBoxGadget(7,0,0,120,24,#PB_ComboBox_Image) :HideGadget(7, 1)
ContainerGadget(8,0,0,120,24,#PB_Container_BorderLess) : HideGadget(8,1)
SpinGadget(80,0,0,120,24,0,100,#PB_Spin_Numeric ) : SetGadgetState(80, 66)
CloseGadgetList()
CloseGadgetList()
AddImage(180, 40, CaptureGadget(1))
AddImage(460, 20, CaptureGadget(2))
AddImage( 40, 180, CaptureGadget(3))
AddImage(460, 220, CaptureGadget(4))
AddImage(460, 360, CaptureGadget(5))
AddImage( 80, 400, CaptureGadget(6))
AddImage(240, 400, CaptureGadget(7))
AddImage(160, 480, CaptureGadget(8))
DrawCanvas()
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = 0
Select EventType()
Case #PB_EventType_LeftButtonDown
x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
If HitTest(x,y)
DrawCanvas()
EndIf
Drag = #True
Case #PB_EventType_LeftButtonUp
Drag = #False
Case #PB_EventType_MouseMove
If Drag = #True
If isCurrentItem
x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
If LastElement(Images())
Images()\x = x - currentItemXOffset
Images()\y = y - currentItemYOffset
DrawCanvas()
EndIf
EndIf
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf