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 ... :wink:

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 :allright:

Verfasst: 30.08.2009 19:01
von X360 Andy
Schade das es nicht mit ImageGadgets geht... oder etwa doch :mrgreen:

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