This may not be exactly what you are looking for but I figured I'd throw it out there just the same. It's very old code and not fully tested with all PB gadgets, so you may need to optimize it here and there. It's not fully commented but it may give you a push in the right direction.
Code: Select all
;...Load cursor to use for sizing
curMove = LoadCursor_(0, #IDC_SIZEALL)
;...Make our sizerbutton transparent
Global hTransBrush = GetStockObject_(#HOLLOW_BRUSH)
Global idChild, oldCallback, sizerButton, moveit
Procedure findChild()
hwin = ChildWindowFromPoint_(WindowID(0),WindowMouseX(0), WindowMouseY(0))
If hwin <> sizerButton
idChild = GetDlgCtrlID_(hwin)
If idChild = 0
topWin = GetTopWindow_(hwin)
idChild = GetDlgCtrlID_(topWin)
EndIf
If idChild > 1
HideGadget(1, 0)
InvalidateRect_(sizerButton, 0, 1)
MoveWindow_(GadgetID(1), GadgetX(idChild)-2, GadgetY(idChild)-2, GadgetWidth(idChild)+4, GadgetHeight(idChild)+4, 1)
InvalidateRect_(GadgetID(idChild), 0, 1)
ElseIf idChild = 1
moveit = #False
ResizeGadget(1, 0, 0, 5, 5)
HideGadget(1, 1)
EndIf
EndIf
If moveit = #True
ReleaseCapture_()
SendMessage_(sizerButton, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
ProcedureReturn idChild
EndProcedure
Procedure WinCallback(hwnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_CTLCOLORBTN
If lParam = sizerButton
SetTextColor_(wParam,$000000)
SetBkMode_(wParam, #TRANSPARENT)
If StartDrawing(WindowOutput(0))
DrawingMode(4)
Box(GadgetX(1),GadgetY(1),GadgetWidth(1),GadgetHeight(1), RGB(255, 0, 0))
Box(GadgetX(1)+1,GadgetY(1)+1,GadgetWidth(1)-2,GadgetHeight(1)-2, RGB(255, 0, 0))
StopDrawing()
EndIf
result=hTransBrush
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Procedure sizerCallback(hwnd, msg, wParam, lParam)
Shared prevX, prevY
result = CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
Select msg
Case #WM_LBUTTONDOWN
moveit = #True
Case #WM_LBUTTONUP
moveit = #False
ReleaseCapture_()
Case #WM_EXITSIZEMOVE
moveit = #False
Case #WM_SIZING
ResizeGadget(idChild, GadgetX(1)+2, GadgetY(1)+2, GadgetWidth(1)-4, GadgetHeight(1)-4)
Case #WM_MOVING
InvalidateRect_(sizerButton, 0, 1)
ResizeGadget(idChild, GadgetX(1)+2, GadgetY(1)+2, GadgetWidth(1)-4, GadgetHeight(1)-4)
Case #WM_GETMINMAXINFO
*mmi.MINMAXINFO = lParam
*mmi\ptMinTrackSize\x = 5
*mmi\ptMinTrackSize\y = 5
EndSelect
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 700, 500, "Manula Gadget Sizing / Positioning", #PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
curDef = GetClassLong_(WindowID(0), #GCL_HCURSOR)
SetWindowCallback(@WinCallback())
;...The sizerbutton is the one that we are able to grip
;...All other gadgets move and resize as the sizerbutton does
sizerButton = ButtonGadget(1, 0, 0, 1, 1,"",#WS_SIZEBOX)
SetWindowLong_(sizerButton, #GWL_STYLE, GetWindowLong_(sizerButton, #GWL_STYLE)|#WS_CHILD|#WS_VISIBLE|#BS_OWNERDRAW)
SetWindowLong_(sizerButton, #GWL_EXSTYLE, GetWindowLong_(sizerButton, #GWL_EXSTYLE)|#WS_EX_TRANSPARENT)
SetClassLong_(GadgetID(1), #GCL_HCURSOR, curMove)
oldCallback = SetWindowLong_(sizerButton, #GWL_WNDPROC, @sizerCallback())
ExplorerTreeGadget(2, 10, 10, 200, 100, "c:\")
ButtonGadget(3, 10, 120, 100, 40, "Button")
ExplorerListGadget(4, 300, 10, 200, 100, "c:/")
Frame3DGadget(5, 300, 120, 200, 100, "Hello World")
Repeat
event = WaitWindowEvent()
Select event
Case #WM_NCMOUSEMOVE
findChild()
Case #WM_MOUSEMOVE
findChild()
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
End