Seite 1 von 1
DragnDrop Visuell
Verfasst: 23.02.2009 00:03
von X360 Andy
Ich überlege ja gerade wie man sowas macht.
Z.b der Visuell Desinger vom PB , dort kann ich ja auch die Gadgets hin und her bewegen ... das ist doch auch en DragnDrop oder ?
Gibts dazu vieleicht einen kleinen Beispiel Code ?
Im Codearchiv finde ich nur Gadget Beispiele und im Forum finde ich auch nichts passendes.
Kiffis Thema hat mich zwar auf die Idee gebracht den Mauszeiger vieleicht wie das Bild / Text zu ändern aber das ist auch nicht die "Perfekte" Lösung.
Ich will also ein art Tile Editor basteln ... nur eben für ein Program
Ich wähle ein Bild aus , darauf werden 5-6 Elemente platziert ... und dann gespeichert (Koordinaten von den platzierungen).
Hoffe jemand versteht wie ich das meine ...

Re: DragnDrop Visuell
Verfasst: 23.02.2009 00:10
von Fluid Byte
X360 Andy hat geschrieben:Ich überlege ja gerade wie man sowas macht.
Z.b der Visuell Desinger vom PB , dort kann ich ja auch die Gadgets hin und her bewegen ... das ist doch auch en DragnDrop oder ?
Kann man aber hier muss man unterscheiden ob das in Echtzeit geschieht oder nach dem Ziehen. Passiert es nicht in Echtzeit braucht man nur einen Auswahlrahmen zu zeichnen und danach die Koordinaten/Größe des Gadgets zu aktualisieren.
Hier ist eine Beispiel von mir wie man es in Echtzeit realisieren kann:
http://www.purebasic.fr/english/viewtopic.php?t=34128
Verfasst: 23.02.2009 00:15
von X360 Andy
Lange rede,kurzer Sinn DAS hab ich gesucht 1000 dank

Verfasst: 30.08.2009 19:01
von X360 Andy
Schade das es nicht mit ImageGadgets geht... oder etwa doch
Code: Alles auswählen
#GRIDSIZE = 10
Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_PAINT
hdc = BeginPaint_(hwnd, ps.PAINTSTRUCT)
For x = 0 To WindowWidth(0) Step #GRIDSIZE
For y = 0 To WindowHeight(0) Step #GRIDSIZE
SetPixel_(hdc, x, y, 0)
Next
Next
EndPaint_(hwnd, ps)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure GagdetProc(hWnd, uMsg, wParam, lParam)
Shared lpPrevFunc
Static bDragging, MTX, MTY
Select uMsg
Case #WM_LBUTTONDOWN
MTX = lParam & $FFFF
MTY = lParam>>16
bDragging = 1
Case #WM_MOUSEMOVE
If bDragging
GetCursorPos_(cpt.POINT)
ScreenToClient_(WindowID(0), cpt)
GetClientRect_(hWnd, crc.RECT)
MoveWindow_(hWnd, (cpt\x-MTX)/#GRIDSIZE*#GRIDSIZE, (cpt\y-MTY)/#GRIDSIZE*#GRIDSIZE, crc\right, crc\bottom, 1)
EndIf
Case #WM_LBUTTONUP
bDragging = 0
EndSelect
ProcedureReturn CallWindowProc_(lpPrevFunc, hWnd, uMsg, wParam, lParam)
EndProcedure
CreateImage(1, 100, 20)
StartDrawing(ImageOutput(1))
Box(0,0,100,20,$FFFFFF)
StopDrawing()
OpenWindow(0, 0, 0, 420, 320, "void", #WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ImageGadget(0, 100, 100, 120, 30,ImageID(1))
lpPrevFunc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @GagdetProc())
SetWindowCallback(@WindowCallback())
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Verfasst: 30.08.2009 19:22
von NicTheQuick
Mach mal 'DisableGadget(0, 1)'. Das müsste gehen.
Verfasst: 30.08.2009 19:26
von X360 Andy
Nep nun kann man es gar nicht mehr bewgen.
Verfasst: 31.08.2009 19:55
von Fluid Byte
Hmm, ich weiß gar nicht warum es beim ButtonGadget funktioniert.
Normalerweise brauch man noch Set- / ReleaseCapture(). Liegt wohl and den Styles. Egal, so gehts:
Code: Alles auswählen
#GRIDSIZE = 10
Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_PAINT
hdc = BeginPaint_(hwnd, ps.PAINTSTRUCT)
For x = 0 To WindowWidth(0) Step #GRIDSIZE
For y = 0 To WindowHeight(0) Step #GRIDSIZE
SetPixel_(hdc, x, y, 0)
Next
Next
EndPaint_(hwnd, ps)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure GagdetProc(hWnd, uMsg, wParam, lParam)
Shared lpPrevFunc
Static bDragging, MTX, MTY
Select uMsg
Case #WM_LBUTTONDOWN
MTX = lParam & $FFFF
MTY = lParam>>16
bDragging = 1
SetCapture_(hwnd)
ProcedureReturn 0
Case #WM_MOUSEMOVE
If bDragging
GetCursorPos_(cpt.POINT)
ScreenToClient_(WindowID(0), cpt)
GetClientRect_(hWnd, crc.RECT)
MoveWindow_(hWnd, (cpt\x-MTX)/#GRIDSIZE*#GRIDSIZE, (cpt\y-MTY)/#GRIDSIZE*#GRIDSIZE, crc\right, crc\bottom, 1)
EndIf
Case #WM_LBUTTONUP
bDragging = 0
ReleaseCapture_()
ProcedureReturn 0
EndSelect
ProcedureReturn CallWindowProc_(lpPrevFunc, hWnd, uMsg, wParam, lParam)
EndProcedure
CreateImage(1, 100, 20)
StartDrawing(ImageOutput(1))
Box(0,0,100,20,$FF00FF)
StopDrawing()
OpenWindow(0, 0, 0, 420, 320, "void", #WS_OVERLAPPEDWINDOW | 1)
ImageGadget(0, 100, 100, 120, 30,ImageID(1))
lpPrevFunc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @GagdetProc())
SetWindowCallback(@WindowCallback())
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Verfasst: 31.08.2009 20:08
von X360 Andy
Cool vielen dank funktioniert 1a