I made some changes to your most recent code:
- Now there are no global variables anymore (converted to local variables or parameters where possible, otherwise to shared variables).
 - Added EnableExplicit and some variable declarations which were then missing.
 - Made the code more generic: Now any number (not only 0) can be used for the canvas gadget.
 - Tiny cosmetic changes.
 
Thanks again!
Code: Select all
EnableExplicit
Structure canvasitem
   img.i
   x.i
   y.i
   width.i
   height.i
   alphatest.i
EndStructure
Enumeration
   #MyCanvas = 1   ; just to test whether a number different from 0 works now
EndEnumeration
Define isCurrentItem=#False
Define currentItemXOffset.i, currentItemYOffset.i
Define Event.i, x.i, y.i, drag.i, hole.i
NewList Images.canvasitem()
Procedure AddImage (List Images.canvasitem(), x, y, img, alphatest=0)
   If AddElement(Images())
      Images()\img    = img
      Images()\x      = x
      Images()\y      = y
      Images()\width  = ImageWidth(img)
      Images()\height = ImageHeight(img)
      Images()\alphatest = alphatest
   EndIf
EndProcedure
Procedure DrawCanvas (canvas.i, List Images.canvasitem())
   If StartDrawing(CanvasOutput(canvas))
      Box(0, 0, GadgetWidth(canvas), GadgetHeight(canvas), RGB(255,255,255))
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      ForEach Images()
         DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ; draw all images with z-order
      Next
      StopDrawing()
   EndIf
EndProcedure
Procedure.i HitTest (List Images.canvasitem(), x, y)
   Shared currentItemXOffset.i, currentItemYOffset.i
   Protected alpha.i, isCurrentItem.i = #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
               alpha = 255
               If Images()\alphatest And ImageDepth(Images()\img)>31
                  If StartDrawing(ImageOutput(Images()\img))
                     DrawingMode(#PB_2DDrawing_AlphaChannel)
                     alpha = Alpha(Point(x-Images()\x,y-Images()\y)) ; get alpha
                     StopDrawing()
                  EndIf
               EndIf
               If alpha
                  MoveElement(Images(), #PB_List_Last)
                  isCurrentItem = #True
                  currentItemXOffset = x - Images()\x
                  currentItemYOffset = y - Images()\y
                  Break
               EndIf
            EndIf
         EndIf
      Until PreviousElement(Images()) = 0
   EndIf
   ProcedureReturn isCurrentItem
EndProcedure
AddImage(Images(),  10, 10, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/PureBasic.bmp"))
AddImage(Images(), 100,100, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/GeeBee2.bmp"))
AddImage(Images(),  50,200, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/AlphaChannel.bmp"))
hole = CreateImage(#PB_Any,100,100,32)
If StartDrawing(ImageOutput(hole))
   DrawingMode(#PB_2DDrawing_AllChannels)
   Box(0,0,100,100,RGBA($00,$00,$00,$00))
   Circle(50,50,48,RGBA($00,$FF,$FF,$FF))
   Circle(50,50,30,RGBA($00,$00,$00,$00))
   StopDrawing()
EndIf
AddImage(Images(),170,70,hole,1)
If OpenWindow(0, 0, 0, 420, 420, "Move/Drag Canvas Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) = 0
   MessageRequester("Fatal error", "Program terminated.")
   End
EndIf
CanvasGadget(#MyCanvas, 10, 10, 400, 400)
DrawCanvas(#MyCanvas, Images())
Repeat
   Event = WaitWindowEvent()
   
   If Event = #PB_Event_Gadget And EventGadget() = #MyCanvas
      Select EventType()
         Case #PB_EventType_LeftButtonDown
            x = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseY)
            isCurrentItem = HitTest(Images(), x, y)
            If isCurrentItem
               DrawCanvas(#MyCanvas, Images())
            EndIf
            Drag = #True
         Case #PB_EventType_LeftButtonUp
            Drag = #False
         Case #PB_EventType_MouseMove
            If Drag = #True
               If isCurrentItem
                  x = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseX)
                  y = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseY)
                  If LastElement(Images())
                     Images()\x = x - currentItemXOffset
                     Images()\y = y - currentItemYOffset
                     DrawCanvas(#MyCanvas, Images())
                  EndIf
               EndIf
            EndIf
      EndSelect
   EndIf   
Until Event = #PB_Event_CloseWindow


