Hallo BSP,BSP hat geschrieben:Hallo Nino.
Ja; Deine Version ist vieleicht etwas einfacher: Aber:
Wenn Du in meiner Version mal die Delay vergrösserst
Delay(50) oder so, dann kannst Du sehen,
das mein Rahmen vom grossen auf das kleine Gadget läuft.
Nicht nur auf den Mauspunkt.
Der Button wird quasi "eingerahmt.
Dadurch ergeben sich ausbaufähige Möglichkeiten.
da hast Du natürlich recht. Ich habe meinen Code jezt entsprechend geändert. Man kann jetzt ein "Startrechteck" und ein "Zielrechteck" übergeben, wobei sich der Mauszeiger als Rechteck mit der Ausdehnung Null interpretieren lässt. Auch das While WindowEvent(): Wend habe ich übernommen.
Trotzdem ist Dein Code unnötig kompliziert.
Statt der Structure "Rahmen" benötigt man nur die 4 Grenzen links, oben, rechts, unten (bzw. Breite und Höhe). Und es ist auch z.B. nicht erforderlich, in der Procedure "AktionsRahmen" Quadratwurzeln zu berechnen.
Das ist jetzt berücksichtigt. Ich sehe allerdings, dass Du inzwischen auch tätig warst.rolaf hat geschrieben:Nino, wenn man die Fenstergröße ändert wird dies beim Aktionsrahmen nicht berücksichtigt.

Dadurch wird die Prozedur unflexibler, während meine folgende neue Version flexibler als die vorige ist.rolaf hat geschrieben:Edit: Parameter "*start.Rect" oben entfernt.
Code: Alles auswählen
EnableExplicit
; ===== Ins Programm einbauen
CompilerIf Defined(Rect, #PB_Structure) = #False
Structure Rect
left.l
top.l
right.l
bottom.l
EndStructure
CompilerEndIf
Procedure AktionsRahmen (idWin.i, *start.Rect, *target.Rect, numSteps.i=100)
Protected.i i
Protected.f x, y, w, h
Protected.f stepLeft, stepAbove, stepWidth, stepHeight
x = *start\left
y = *start\top
w = *start\right - *start\left
h = *start\bottom - *start\top
stepLeft = (*target\left - *start\left) / numSteps
stepAbove = (*target\top - *start\top) / numSteps
stepWidth = (w - *target\right + *target\left) / numSteps
stepHeight = (h - *target\bottom + *target\top) / numSteps
StartDrawing(WindowOutput(idWin))
DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined)
For i = 1 To numSteps
x + stepLeft
y + stepAbove
w - stepWidth
h - stepHeight
Box(x, y, w, h)
Delay(4)
; Delay(50) ; Test
Box(x, y, w, h)
While WindowEvent(): Wend
Next
StopDrawing()
EndProcedure
; ===== Hier beginnt das Demoprogramm
Procedure GetGadgetFrame (gadget.i, *frame.Rect)
*frame\left = GadgetX(gadget)
*frame\top = GadgetY(gadget)
*frame\right = GadgetX(gadget) + GadgetWidth(gadget)
*frame\bottom = GadgetY(gadget) + GadgetHeight(gadget)
EndProcedure
Enumeration
#Window
EndEnumeration
Enumeration
#List
#Button
EndEnumeration
Define.Rect rList, rButton, rMouse
Define.i flags, x, y, w, h, ende=0
flags = #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
OpenWindow(#Window, 0, 0, 800, 400, "Fenster", flags)
x = 4
y = 4
w = WindowWidth(#Window) - 8
h = WindowHeight(#Window) - 50
ListIconGadget(#List, x, y, w, h, "Test", w, #PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection)
AddGadgetItem(#List, -1, "Eine Zeile")
x = WindowWidth(#Window)/4 - 25
y = WindowHeight(#Window) - 40
w = 100
h = 30
ButtonGadget(#Button, x, y, w, h, "ClipBoard")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
ende = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
GetGadgetFrame(#List, @rList)
GetGadgetFrame(#Button, @rButton)
AktionsRahmen(#Window, @rList, @rButton)
Case #List
If EventType() = #PB_EventType_LeftClick
GetGadgetFrame(#List, @rList)
rMouse\left = WindowMouseX(#Window)
rMouse\top = WindowMouseY(#Window)
rMouse\right = rMouse\left
rMouse\bottom = rMouse\top
AktionsRahmen(#Window, @rList, @rMouse)
EndIf
EndSelect
EndSelect
Until ende