DragnDrop Visuell

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

DragnDrop Visuell

Beitrag 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:
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: DragnDrop Visuell

Beitrag 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
Zuletzt geändert von Fluid Byte am 23.02.2009 00:22, insgesamt 1-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Lange rede,kurzer Sinn DAS hab ich gesucht 1000 dank :allright:
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Mach mal 'DisableGadget(0, 1)'. Das müsste gehen.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Nep nun kann man es gar nicht mehr bewgen.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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 
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Cool vielen dank funktioniert 1a
Antworten