It is currently Wed Sep 18, 2019 8:58 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 8 posts ] 
Author Message
 Post subject: Scalable Box Around Gadget (Anchors)
PostPosted: Sat Aug 24, 2019 8:38 pm 
Offline
User
User

Joined: Tue Aug 20, 2019 6:47 pm
Posts: 16
Hi all,

Here is a code that could be useful for those who would like to use anchoring points to enlarge or move everything inside the box.

Here is a photo that shows the source in execution:
Image


I hope this gona be useful to someone. Here is the code:

Code:
Global.l       WndFlags
Global.i       BorderID,  WndIndex

Enumeration  ; ANCHOR ID (Position Index)
     ;>>
     ;
     #ANCHOR_MiddleLF    = 1
     #ANCHOR_MiddleTP
     #ANCHOR_MiddleRT
     #ANCHOR_MiddleBM
     #ANCHOR_CornerTL
     #ANCHOR_CornerTR
     #ANCHOR_CornerBR
     #ANCHOR_CornerBL
     ;
     ;<<
EndEnumeration

Structure      ANCHOR_STRUCT
     ;>>
     ;
     ChildGad.i                         ;
     GadIndex.i[9]                      ;
                                        ;
     
     DrwIndex.i                         ; Canvas Index
     
     ImgIndex.i                         ; Image To Be Draw In Canvas
     ;
     ;<<
EndStructure
;
Global NewList ANCHOR_ItemList.ANCHOR_STRUCT()


Procedure      MoveAnchorGadgets( *AnchorID.ANCHOR_STRUCT )
     ;>>
     ;
     Protected.l BorderBM,  BorderLF,  BorderRT,  BorderTP
     Protected.l ExternRT,  MiddlePX,  MiddlePY
     Protected.i ChildGad
     ;
     ;
     ChildGad = BorderID;*AnchorID\ChildGad
     ;
     BorderLF =  GadgetX(ChildGad) : PxlSizeX = GadgetWidth( ChildGad)
     BorderTP =  GadgetY(ChildGad) : PxlSizeY = GadgetHeight(ChildGad)
     ;
     MiddlePX =  BorderLF + (PxlSizeX - 8) >> 1
     ExternRT =  BorderLF +  PxlSizeX - 8
     BorderRT =  ExternRT -  8
     ;
     MiddlePY =  BorderTP + (PxlSizeY - 8) >> 1
     BorderBM =  BorderTP +  PxlSizeY - 8
     ;
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_MiddleLF]),#Null,BorderLF,MiddlePY,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_MiddleTP]),#Null,MiddlePX,BorderTP,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_MiddleRT]),#Null,ExternRT,MiddlePY,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_MiddleBM]),#Null,MiddlePX,BorderBM,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_CornerTL]),#Null,BorderLF + 8,BorderTP,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_CornerTR]),#Null,BorderRT,BorderTP,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_CornerBR]),#Null,BorderRT,BorderBM,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     SetWindowPos_(GadgetID(*AnchorID\GadIndex[#ANCHOR_CornerBL]),#Null,BorderLF + 8,BorderBM,#Null,#Null,#SWP_NOSIZE | #SWP_FRAMECHANGED)
     ;
     ;<<
EndProcedure
;
Procedure      DispatchAnchorBL()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  CoordOnY
     Protected.l              HalfDimX,  HalfDimY
     ;
     Static.l                 GadgetPX,  GadgetPY,  OffsetPX,  OffsetPY,  Selected, ScreenPX,  ScreenPY
     ;
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX =  GadgetPX + (DesktopMouseX() - ScreenPX) - OffsetPX
                    CoordOnY =  GadgetPY + (DesktopMouseY() - ScreenPY) - OffsetPY
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,CoordOnX - 8,CoordOnY - GadgetHeight(ChildGad) - 8,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;     
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,CoordOnX,CoordOnY - GadgetHeight(ChildGad),#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ;
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorBR()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  CoordOnY
     Protected.l              HalfDimX,  HalfDimY
     ;
     Static.l                 GadgetPX,  GadgetPY,  OffsetPX,  OffsetPY,  Selected, ScreenPX,  ScreenPY
     ;
     ;
     GadIndex = EventGadget()
    *AnchorID = GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX =  GadgetPX + (DesktopMouseX() - ScreenPX) - OffsetPX
                    CoordOnY =  GadgetPY + (DesktopMouseY() - ScreenPY) - OffsetPY
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,CoordOnX - GadgetWidth(ChildGad),CoordOnY - GadgetHeight(ChildGad) - 8,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,CoordOnX - GadgetWidth(ChildGad) + 8,CoordOnY - GadgetHeight(ChildGad),#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ;
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorMB()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex,  HandleID
     Protected.l              CoordOnY,  PxlSizeY
     ;
     Static.l                 StartAtY,  GadgetPY,  OffsetPY,  Selected, ScreenPY
     ;
     Protected.RECT           AreaRect
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnY = StartAtY + OffsetPY - (DesktopMouseY() - ScreenPY)
                    PxlSizeY = GadgetPY - CoordOnY
                    ;
                    GadPosiX = GadgetX(ChildGad)
                    GadSizeX = GadgetWidth(ChildGad)
                    ;
                    Select GadgetType(ChildGad)
                         Case #PB_GadgetType_ComboBox
                              If PxlSizeY <  20 : PxlSizeY =  20 : EndIf
                              If PxlSizeY > 260 : PxlSizeY = 260 : EndIf
                              ;
                         Case #PB_GadgetType_Text
                              If PxlSizeY <  14 : PxlSizeY =  14 : EndIf
                              ;
                    EndSelect
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,#PB_Ignore,#PB_Ignore,GadSizeX + 16,PxlSizeY + 16)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,GadPosiX,StartAtY,GadSizeX,PxlSizeY)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               ;
               StartAtY =  GadgetPY + OffsetPY - (DesktopMouseY() - ScreenPY) - GadgetHeight(ChildGad)
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
               ;
               WndStyle = GetWindowLongPtr_(GadgetID(ChildGad),#GWL_STYLE)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorML()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  PxlSizeX
     ;
     Static.l                 CloseAtX,  GadgetPX,  OffsetPX,  Selected, ScreenPX
     ;
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX = GadgetPX + OffsetPX + (DesktopMouseX() - ScreenPX)
                    PxlSizeX = CloseAtX - CoordOnX +  8
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,CoordOnX - 8,#PB_Ignore,PxlSizeX + 16,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,CoordOnX,#PB_Ignore,PxlSizeX,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               ;
               CloseAtX =  GadgetPX + (DesktopMouseX() - ScreenPX) - OffsetPX + GadgetWidth(ChildGad)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorMR()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  PxlSizeX
     ;
     Static.l                 StartAtX,  GadgetPX,  OffsetPX,  Selected, ScreenPX
     ;
     ;
     GadIndex = EventGadget()
    *AnchorID = GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX = StartAtX + OffsetPX - (DesktopMouseX() - ScreenPX)
                    PxlSizeX = GadgetPX - CoordOnX
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,#PB_Ignore,#PB_Ignore,PxlSizeX + 16,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,StartAtX,#PB_Ignore,PxlSizeX,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               ;
               StartAtX =  GadgetPX + OffsetPX - (DesktopMouseX() - ScreenPX) - GadgetWidth(ChildGad)
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorMT()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnY,  PxlSizeY
     ;
     Static.l                 CloseAtY,  GadgetPY,  OffsetPY,  Selected,  ScreenPY 
     ;
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnY = GadgetPY + OffsetPY + (DesktopMouseY() - ScreenPY)
                    PxlSizeY = CloseAtY - CoordOnY +  8
                    ;
                    Select GadgetType(ChildGad)
                         Case #PB_GadgetType_ComboBox
                              If PxlSizeY <  20 : PxlSizeY =  20 : CoordOnY = GadgetY(*AnchorID\GadIndex[#ANCHOR_MiddleBM]) - PxlSizeY : EndIf
                              If PxlSizeY > 260 : PxlSizeY = 260 : CoordOnY = GadgetY(*AnchorID\GadIndex[#ANCHOR_MiddleBM]) - PxlSizeY : EndIf
                              ;
                         Case #PB_GadgetType_Text
                              If PxlSizeY <  14 : PxlSizeY =  14 : CoordOnY = GadgetY(*AnchorID\GadIndex[#ANCHOR_MiddleBM]) - PxlSizeY : EndIf
                    EndSelect
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,#PB_Ignore,CoordOnY - 8,    #PB_Ignore,PxlSizeY + 16)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,#PB_Ignore,CoordOnY,#PB_Ignore,PxlSizeY)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               ;
               CloseAtY =  GadgetPY + (DesktopMouseY() - ScreenPY) - OffsetPY + GadgetHeight(ChildGad)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorTL()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  CoordOnY
     Protected.l              HalfDimX,  HalfDimY
     ;
     Static.l                 GadgetPX,  GadgetPY,  OffsetPX,  OffsetPY,  Selected, ScreenPX,  ScreenPY
     ;
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX =  GadgetPX + (DesktopMouseX() - ScreenPX) - OffsetPX
                    CoordOnY =  GadgetPY + (DesktopMouseY() - ScreenPY) - OffsetPY
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,CoordOnX - 8,CoordOnY,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,CoordOnX,CoordOnY + 8,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ;
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
Procedure      DispatchAnchorTR()
     ;>>
     ;
     Protected.ANCHOR_STRUCT *AnchorID
     Protected.i              ChildGad,  GadIndex
     Protected.l              CoordOnX,  CoordOnY
     Protected.l              HalfDimX,  HalfDimY
     ;
     Static.l                 GadgetPX,  GadgetPY,  OffsetPX,  OffsetPY,  Selected, ScreenPX,  ScreenPY
     ;
     ;
     GadIndex =  EventGadget()
    *AnchorID =  GetGadgetData(GadIndex)
     ;
     ChildGad = *AnchorID\ChildGad
     ;
     Select EventType()
          Case #PB_EventType_MouseMove
               If Selected
                    CoordOnX =  GadgetPX + (DesktopMouseX() - ScreenPX) - OffsetPX
                    CoordOnY =  GadgetPY + (DesktopMouseY() - ScreenPY) - OffsetPY
                    ;
                    LockWindowUpdate_(GadgetID(BorderID))
                         ResizeGadget(BorderID,CoordOnX - GadgetWidth(ChildGad),CoordOnY,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;     
                    LockWindowUpdate_(GadgetID(ChildGad))
                         ResizeGadget(ChildGad,CoordOnX - GadgetWidth(ChildGad) + 8,CoordOnY + 8,#PB_Ignore,#PB_Ignore)
                    LockWindowUpdate_(0)
                    ;
                    MoveAnchorGadgets(*AnchorID)
               EndIf
               ;
          Case #PB_EventType_LeftButtonDown
               OffsetPX =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseX)
               OffsetPY =  GetGadgetAttribute(GadIndex,#PB_Canvas_MouseY)
               ;
               ScreenPX =  GadgetX(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPX =  GadgetX(GadIndex,#PB_Gadget_ContainerCoordinate)
               ScreenPY =  GadgetY(GadIndex,#PB_Gadget_ScreenCoordinate)
               GadgetPY =  GadgetY(GadIndex,#PB_Gadget_ContainerCoordinate)
               ;
               Selected = #True
               ;
          Case #PB_EventType_LeftButtonUp
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
               ;
          Case #PB_EventType_MouseEnter
               SetGadgetAttribute(GadIndex,#PB_Canvas_Cursor,#PB_Cursor_Hand)
               ;
               Selected = #False
     EndSelect
     ;
     ;<<
EndProcedure
;
Procedure      InitGadgetAnchorBorder( *StructID.ANCHOR_STRUCT,  AnchorID.i,  ParentID.i,  StyleVal.l )
     ;>>
     ;
     SetGadgetData(AnchorID,*StructID)
     ;
     StartDrawing(CanvasOutput(AnchorID))
          DrawingMode(#PB_2DDrawing_Outlined)
          Box(#Null,#Null,OutputWidth(),OutputHeight(),#Black)
     StopDrawing()
     ;
     SetParent_(GadgetID(AnchorID),ParentID)
     ;
     Select StyleVal
          Case 8  : *StructID\GadIndex[#ANCHOR_CornerBL] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorBL())
          Case 7  : *StructID\GadIndex[#ANCHOR_CornerBR] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorBR())
          Case 6  : *StructID\GadIndex[#ANCHOR_CornerTR] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorTR())
          Case 5  : *StructID\GadIndex[#ANCHOR_CornerTL] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorTL())
          Case 4  : *StructID\GadIndex[#ANCHOR_MiddleBM] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorMB())
          Case 3  : *StructID\GadIndex[#ANCHOR_MiddleRT] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorMR())
          Case 2  : *StructID\GadIndex[#ANCHOR_MiddleTP] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorMT())
          Case 1  : *StructID\GadIndex[#ANCHOR_MiddleLF] = AnchorID : BindGadgetEvent(AnchorID,@DispatchAnchorML())
          Default : *StructID\GadIndex[0] = AnchorID
     EndSelect
     ;
     ;<<
EndProcedure
;
Procedure.l    DispatchGadgets( WindowID.l,  WMessage.l,  WParamID.l,  LParamID.l )
     ;>>
     ;
     Protected.RECT        ClientRC
     Protected.PAINTSTRUCT PStruct
     ;
     ;
     ;If WMessage = #WM_ERASEBKGND : ProcedureReturn #True : EndIf
     
     ;
     ProcedureReturn CallWindowProc_(GetWindowLongPtr_(WindowID,#GWLP_USERDATA),WindowID,WMessage,WParamID,LParamID)
     ;
     ;<<
EndProcedure

Procedure.i    CreateGadgetAnchors( GadIndex.i )
     ;>>
     ;
     Protected.ANCHOR_STRUCT *StructID
     Protected.i              CornerBL,  CornerBR,  CornerTL,  CornerTR,  MiddleBM,  MiddleLF,  MiddleRT,  MiddleTP
     Protected.i              DrwIndex,  HandleID,  ParentID
     Protected.l              CenterPX,  CenterPY,  CloseAtX,  CloseAtY,  CoordOnX,  CoordOnY
     Protected.l              OriginX1,  OriginX2,  PxlSizeX,  PxlSizeY,  StartAtX,  StartAtY
     ;
     ;
     If IsGadget(GadIndex)
          HandleID = GadgetID(GadIndex)   ;: SetWindowLongPtr_(HandleID,#GWLP_USERDATA,GetWindowLongPtr_(HandleID,#GWLP_WNDPROC)) : SetWindowLongPtr_(HandleID,#GWLP_WNDPROC,@DispatchGadgets())
          ParentID = GetParent_(HandleID) : SetWindowLongPtr_(ParentID,#GWL_STYLE,GetWindowLongPtr_(ParentID,#GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
          ;
          CoordOnX = GadgetX(GadIndex)              : CoordOnY = GadgetY(GadIndex)
          PxlSizeX = GadgetWidth(GadIndex)          : PxlSizeY = GadgetHeight(GadIndex)
          ;
          CenterPX = CoordOnX + (PxlSizeX >> 1) - 4 : CenterPY = CoordOnY + (PxlSizeY >> 1) - 4
          CloseAtX = CoordOnX +  PxlSizeX           : CloseAtY = CoordOnY +  PxlSizeY
          StartAtX = CoordOnX -  8                  : StartAtY = CoordOnY -  8
          ;
          OriginX1 = CoordOnX
          OriginX2 = CloseAtX - 8
          ;
          BorderID = ContainerGadget(#PB_Any,StartAtX,StartAtY,PxlSizeX + 16,PxlSizeY + 16,#PB_Container_BorderLess)
          SetWindowLongPtr_(GadgetID(BorderID),#GWL_STYLE,GetWindowLongPtr_(GadgetID(BorderID),#GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
          ;
          MiddleLF = CanvasGadget(#PB_Any,StartAtX,CenterPY,  8,  8)
          ;
          If MiddleLF
               MiddleTP = CanvasGadget(#PB_Any,CenterPX,StartAtY,  8,  8)
               ;
               If MiddleTP
                    MiddleRT = CanvasGadget(#PB_Any,CloseAtX,CenterPY,  8,  8)
                    ;
                    If MiddleRT
                         MiddleBM = CanvasGadget(#PB_Any,CenterPX,CloseAtY,  8,  8)
                         ;
                         If MiddleBM
                              CornerTL = CanvasGadget(#PB_Any,Originx1,StartAtY,  8, 8)
                              ;
                              If CornerTL
                                   CornerTR = CanvasGadget(#PB_Any,OriginX2,StartAtY,  8,  8)
                                   ;
                                   If CornerTR
                                        CornerBR = CanvasGadget(#PB_Any,OriginX2,CloseAtY,  8,  8)
                                        ;
                                        If CornerBR
                                             CornerBL = CanvasGadget(#PB_Any,OriginX1,CloseAtY,  8,  8)
                                             ;
                                             If CornerBL
                                                 *StructID = AddElement(ANCHOR_ItemList())
                                                  ;
                                                  If *StructID
                                                      *StructID\ChildGad = GadIndex
                                                       ;
                                                       InitGadgetAnchorBorder(*StructID,CornerBL,ParentID,8)
                                                       InitGadgetAnchorBorder(*StructID,CornerBR,ParentID,7)
                                                       InitGadgetAnchorBorder(*StructID,CornerTR,ParentID,6)
                                                       InitGadgetAnchorBorder(*StructID,CornerTL,ParentID,5)
                                                       InitGadgetAnchorBorder(*StructID,MiddleBM,ParentID,4)
                                                       InitGadgetAnchorBorder(*StructID,MiddleRT,ParentID,3)
                                                       InitGadgetAnchorBorder(*StructID,MiddleTP,ParentID,2)
                                                       InitGadgetAnchorBorder(*StructID,MiddleLF,ParentID,1)
                                                       ;
                                                       
                                                  EndIf
                                             EndIf
                                        EndIf
                                   EndIf
                              EndIf
                         EndIf
                    EndIf
               EndIf
          EndIf
          ;
          CloseGadgetList()
     EndIf
     
     ;
     ;<<
EndProcedure


WndFlags = #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget
WndIndex =  OpenWindow(#PB_Any,  0,  0,600,340,"Resize The Window To Have More Space",WndFlags)
;
If WndIndex
     ButtonGadget(101, 60, 60,200,60,"Move Or Resize The Gadget")
     ;
     CreateGadgetAnchors(101)
     ;
     Repeat
     Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
;
End


Give some feedback about it.

Roger Beausoleil Quebec - Canada


Last edited by RBeausoleil on Sun Aug 25, 2019 8:15 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 1:33 pm 
Offline
Addict
Addict
User avatar

Joined: Sun Nov 05, 2006 11:42 pm
Posts: 4502
Location: Lyon - France
Hello RBeausoleil,

I have little flickering when i resize and move

Use gadgets for create handles it's a little bit the same method of this code, but with TextGadget
http://www.purebasic.fr/french/viewtopic.php?t=8828
and without the corners gadgets :wink:

Thanks for sharing 8)

_________________
ImageThe happiness is a road...
Not a destination


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 2:07 pm 
Offline
User
User

Joined: Tue Aug 20, 2019 6:47 pm
Posts: 16
Hi Kwai chang caine,

Thank you tried the code. I am very surprised about the "Flicker". Do you have an ATI video card because I did the test with 3 devices equipped with NVidia and they did not have it ... maybe a mix of both codes can give a marvellous result ;)


Thanks again.

Roger


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 2:54 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Fri Apr 25, 2003 5:10 pm
Posts: 487
Location: Doubs - France
Hello RBeausoleil,

it's OK, no flickering at all (sorry KCC :mrgreen: )

WIN10 64bit , PB 5.70 LTS 64bit , Processor Intel i5-7400 3.00GHz, NVIDIA GeForce GTX 1060 3 GB, RAM 8GB

_________________
A+
Denis


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 7:59 pm 
Offline
Addict
Addict
User avatar

Joined: Thu Feb 09, 2006 11:27 pm
Posts: 2437
See also this thread...


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 8:16 pm 
Offline
User
User

Joined: Tue Aug 20, 2019 6:47 pm
Posts: 16
Hi All

KCC was right. The small squares was flicking a bit. I re-writes some lines to avoid that.

See the updated code in the first Post.

Plz take a looks and try again.

Roger Beausoleil Quebec - Canada


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Sun Aug 25, 2019 8:23 pm 
Offline
User
User

Joined: Tue Aug 20, 2019 6:47 pm
Posts: 16
Hi Michael Vogel

I really like what I saw in the Post that you suggest me except that the gadget inside the box Flicks too much for me. Anyway, it's just a code that only needs to be improved ;)

Roger Beausoleil Quebec - Canada


Top
 Profile  
Reply with quote  
 Post subject: Re: Scalable Box Around Gadget (Anchors)
PostPosted: Wed Aug 28, 2019 1:26 pm 
Offline
Addict
Addict
User avatar

Joined: Sun Nov 05, 2006 11:42 pm
Posts: 4502
Location: Lyon - France
Rbeausoleil wrote:
Do you have an ATI video card
I have surely a card in cardboard :oops:
On my basic little VIVO
Image

This time i have tested on another machine, a basic notebook W10 X64 / v5.70 x86 and no flickering but traces of handles when i resize not enough slowly :wink:

_________________
ImageThe happiness is a road...
Not a destination


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 15 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye