PureBasic Forum
https://www.purebasic.fr/english/

Scalable Box Around Gadget (Anchors)
https://www.purebasic.fr/english/viewtopic.php?f=27&t=73470
Page 1 of 1

Author:  RBeausoleil [ Sat Aug 24, 2019 8:38 pm ]
Post subject:  Scalable Box Around Gadget (Anchors)

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

Author:  Kwai chang caine [ Sun Aug 25, 2019 1:33 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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)

Author:  RBeausoleil [ Sun Aug 25, 2019 2:07 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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

Author:  Denis [ Sun Aug 25, 2019 2:54 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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

Author:  Michael Vogel [ Sun Aug 25, 2019 7:59 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

See also this thread...

Author:  RBeausoleil [ Sun Aug 25, 2019 8:16 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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

Author:  RBeausoleil [ Sun Aug 25, 2019 8:23 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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

Author:  Kwai chang caine [ Wed Aug 28, 2019 1:26 pm ]
Post subject:  Re: Scalable Box Around Gadget (Anchors)

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:

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/