Hab mal etwas zusammengekritzelt, was unter Windows und Linux funzt.
Code: Alles auswählen
#MB_DOWN = 2
#MB_UP = 4
#RESIZEBOX_WIDTH = 6
#RESIZEBOX_HEIGHT = 6
Structure SArea_Area
;Identifiers:
ID.l
;Positions:
X.l
Y.l
Width.l
Height.l
EndStructure
Structure SArea_Box
X.l
Y.l
EndStructure
NewList Area_Area.SArea_Area()
Dim Area_Box.SArea_Box(7)
Procedure WindowMouseButton(Wnd, ButtonNr)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
;Linux Version
Protected gdkWnd.l, x.l, y.l, mask.l
If Wnd
*Window.GTKWindow = Wnd
gdkWnd = *Window\bin\child\window
gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
Select ButtonNr
Case 0
If (mask & #GDK_BUTTON1_MASK)
ProcedureReturn 1
EndIf
Case 1
If (mask & #GDK_BUTTON3_MASK)
ProcedureReturn 1
EndIf
Case 2
If (mask & #GDK_BUTTON2_MASK)
ProcedureReturn 1
EndIf
EndSelect
EndIf
CompilerElse
;Windows Version
If Wnd And GetForegroundWindow_() = Wnd
Select ButtonNr
Case 0
If GetAsyncKeyState_(#VK_LBUTTON) > 0
ProcedureReturn 1
EndIf
Case 1
If GetAsyncKeyState_(#VK_RBUTTON) > 0
ProcedureReturn 1
EndIf
Case 2
If GetAsyncKeyState_(#VK_MBUTTON) > 0
ProcedureReturn 1
EndIf
EndSelect
EndIf
CompilerEndIf
ProcedureReturn 0
EndProcedure
Procedure.l IsCoordOnArea(X.l, Y.l, AX.l, AY.l, AWidth.l, AHeight.l)
If X >= AX And Y >= AY And (AX+AWidth) >= X And (AY+AHeight) >= Y
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure.l CreateArea(x, y, width, height)
Static CurrentID.l
If width < 0 : x + width : width * -1 : EndIf
If height < 0 : y + height : height * -1 : EndIf
CurrentID + 1
AddElement(Area_Area())
Area_Area()\ID = CurrentID.l
Area_Area()\X = x
Area_Area()\Y = y
Area_Area()\Width = width
Area_Area()\height = height
ProcedureReturn CurrentID
EndProcedure
Procedure.l DeleteArea(ID)
ForEach Area_Area()
If Area_Area()\ID = ID
DeleteElement(Area_Area())
Result = 1
Break
EndIf
Next
ProcedureReturn Result
EndProcedure
Procedure.l DrawAreas(WindowID, *Callback)
Static MouseX.l, MouseY.l, oMouseX.l, oMouseY.l
Static oLMouseButton.l, LMouseButton.l
Static CurAreaSelected.l, CurBoxSelected.l
Protected DeltaMouseX.l, DeltaMouseY.l, LMEvent.l
oLMouseButton = LMouseButton
LMouseButton = WindowMouseButton(WindowID, 0)
oMouseX = MouseX
oMouseY = MouseY
MouseX = WindowMouseX()
MouseY = WindowMouseY()
DeltaMouseX = MouseX-oMouseX
DeltaMouseY = MouseY-oMouseY
If oLMouseButton <> 0 And LMouseButton = 0
LMEvent = #MB_UP
ElseIf oLMouseButton = 0 And LMouseButton <> 0
LMEvent = #MB_DOWN
EndIf
If LMEvent = #MB_UP
CurAreaSelected = 0
CurBoxSelected = 0
If Area_Area()\Width < 0 : Area_Area()\X + Area_Area()\Width : Area_Area()\Width * -1 : EndIf
If Area_Area()\Height < 0 : Area_Area()\Y + Area_Area()\Height : Area_Area()\Height * -1 : EndIf
EndIf
ForEach Area_Area()
; If Area_Area()\Width < 0
; Area_Area()\X + Area_Area()\Width
; Area_Area()\Width * -1
; If CurBoxSelected <> 0
; If CurBoxSelected <= 2 Or (CurBoxSelected <= 6 And CurBoxSelected >= 5)
; CurBoxSelected + 2
; Else
; CurBoxSelected - 2
; EndIf
; EndIf
; EndIf
; If Area_Area()\Height < 0
; Area_Area()\Y + Area_Area()\Height
; Area_Area()\Height * -1
; If CurBoxSelected <> 0
; If CurBoxSelected <= 2 Or (CurBoxSelected <= 6 And CurBoxSelected >= 5)
; CurBoxSelected + 2
; Else
; CurBoxSelected - 2
; EndIf
; EndIf
; EndIf
If *Callback
x = Area_Area()\X
y = Area_Area()\Y
w = Area_Area()\Width
h = Area_Area()\Height
If w < 0 : x + w : w * -1 : EndIf
If h < 0 : y + h : h * -1 : EndIf
CallFunctionFast(*Callback, Area_Area()\ID, x, y, w, h)
EndIf
;Border
DrawingMode(2|4)
Box(Area_Area()\X, Area_Area()\Y, Area_Area()\Width, Area_Area()\Height)
DrawingMode(2)
;Cornerpoints
Area_Box(0)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5))
Area_Box(0)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
Area_Box(1)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5)) + Area_Area()\Width
Area_Box(1)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
Area_Box(2)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5)) + Area_Area()\Width
Area_Box(2)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
Area_Box(3)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5))
Area_Box(3)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
Area_Box(4)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5)) + Area_Area()\Width * 0.5
Area_Box(4)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
Area_Box(5)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5)) + Area_Area()\Width
Area_Box(5)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height * 0.5
Area_Box(6)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5)) + Area_Area()\Width * 0.5
Area_Box(6)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
Area_Box(7)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH * 0.5))
Area_Box(7)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height * 0.5
;Movement of the area
If LMEvent = #MB_DOWN And IsCoordOnArea(MouseX, MouseY, Area_Area()\X+Int(#RESIZEBOX_WIDTH*0.5), Area_Area()\Y+Int(#RESIZEBOX_HEIGHT*0.5), Area_Area()\Width-#RESIZEBOX_WIDTH, Area_Area()\Height-#RESIZEBOX_HEIGHT) = 1
If CurAreaSelected = 0 And CurBoxSelected = 0
CurAreaSelected = Area_Area()\ID
CurBoxSelected = 0
EndIf
ElseIf CurAreaSelected = Area_Area()\ID And CurBoxSelected = 0
Area_Area()\X + DeltaMouseX
Area_Area()\Y + DeltaMouseY
EndIf
;Draw and check the resizeboxes
For k=0 To 7
Box(Area_Box(k)\X, Area_Box(k)\Y, #RESIZEBOX_WIDTH, #RESIZEBOX_HEIGHT)
If LMEvent = #MB_DOWN And IsCoordOnArea(MouseX, MouseY, Area_Box(k)\X, Area_Box(k)\Y, #RESIZEBOX_WIDTH, #RESIZEBOX_HEIGHT) = 1
If CurAreaSelected = 0 And CurBoxSelected = 0
CurAreaSelected = Area_Area()\ID
CurBoxSelected = k+1
EndIf
ElseIf CurAreaSelected = Area_Area()\ID And CurBoxSelected = k+1
Select k
Case 0 ;Left-Top
Area_Area()\Width + (Area_Area()\X-MouseX)
Area_Area()\X = MouseX
Area_Area()\Height + (Area_Area()\Y-MouseY)
Area_Area()\Y = MouseY
Case 1 ;Right-Top
Area_Area()\Width = (MouseX-Area_Area()\X)
Area_Area()\Height + (Area_Area()\Y-MouseY)
Area_Area()\Y = MouseY
Case 2 ;Right-Bottom
Area_Area()\Width = (MouseX-Area_Area()\X)
Area_Area()\Height = (MouseY-Area_Area()\Y)
Case 3 ;Left-Bottom
Area_Area()\Width + (Area_Area()\X-MouseX)
Area_Area()\X = MouseX
Area_Area()\Height = (MouseY-Area_Area()\Y)
Case 4 ;Top
Area_Area()\Height + (Area_Area()\Y-MouseY)
Area_Area()\Y = MouseY
Case 5 ;Right
Area_Area()\Width = (MouseX-Area_Area()\X)
Case 6 ;Bottom
Area_Area()\Height = (MouseY-Area_Area()\Y)
Case 7 ;Left
Area_Area()\Width + (Area_Area()\X-MouseX)
Area_Area()\X = MouseX
EndSelect
EndIf
Next
Next
EndProcedure
;-Example:
Procedure TheCallback(ID, X, Y, Width, Height)
Box(X, Y, Width, Height, RGB(255-ID*10, 0, 0))
EndProcedure
OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test")
ID = CreateArea(100, 100, 320, 200)
CreateImage(0, 640, 480)
Repeat
;Backbuffer:
ResizeImage(0, WindowWidth(), WindowHeight())
StartDrawing(ImageOutput())
Box(0, 0, ImageWidth(), ImageHeight(), RGB(255, 255, 255))
DrawAreas(WindowID(), @TheCallback())
StopDrawing()
;Flip it:
StartDrawing(WindowOutput())
DrawImage(ImageID(), 0, 0)
StopDrawing()
Event = WindowEvent()
Delay(30)
Until Event = #PB_Event_CloseWindow
End