Seite 1 von 1

Wie kann ich ICONs dragen und droppen?

Verfasst: 11.02.2008 17:15
von Xaby
Habe versucht eine Art Arbeitsplatz oder Desktop nachzubilden.
Allerdings ist es noch keien ideale und schöne Lösung.
Der Mauszeiger sollte wohl lieber geändert werden als dass man ein zusätzliches Fenster nimmt. Und die ImageGadgets müssten noch besser aktualisiert werden, damit keine unschönen Darstellungsfehler auftauchen.

Vielleicht kann man ja auch ein LIstIconGadget so manipulieren, dass man dort genauer angeben kann, wo die Icons liegen sollen und wie groß diese sein sollen.

Code: Alles auswählen


;/ Drag'n'Drop von Icons, bzw. Bildern by xaby


;/ FluidByte
Global osi.OSVERSIONINFO 
osi\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO) 
GetVersionEx_(osi)


Structure gi
  g.l
  i.l
EndStructure

Global DragGadgetID.l, DragImageID.l
Global NewList GID.gi(); GadgetIDs


Procedure OpenDragWindow()
OpenWindow(0,DesktopMouseX(),DesktopMouseY(),64,64,"DragDrop",#PB_Window_BorderLess,WindowID(1))
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,64,64,ImageID(DragImageID))

StickyWindow(0,1)
If osi\dwPlatformId = #VER_PLATFORM_WIN32_NT 
  SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_LAYERED)    
  SetLayeredWindowAttributes_(WindowID(0),0,100,#LWA_ALPHA) 
EndIf 

EndProcedure

#XAusrichtung=66
#YAusrichtung=32

  Procedure DragCallback(Aktion)
      ;/ WIE KANN ICH DAS #IMAGE mit Wert 0 anzeigen am Mauszeiger lassen?
         
      If IsWindow(0)      
        
      Else
        OpenDragWindow()
      EndIf  
      ResizeWindow(0,DesktopMouseX()-#XAusrichtung,DesktopMouseY()-#YAusrichtung,#PB_Ignore,#PB_Ignore)
    ProcedureReturn #True
  EndProcedure
  
 

SetDragCallback(@DragCallback())





OpenWindow(1,30,30,420,630,"Test Drag 'n Drop",#PB_Window_TitleBar | #PB_Window_SystemMenu)

CreateGadgetList(WindowID(1))    
      
    ScrollAreaGadget(10,10,80,400,500,380,480,10)
    EnableGadgetDrop(10,#PB_Drop_Text,#PB_Drag_Copy)
        
    For i=0 To 5 
       AddElement(GID())
       With GID()
       \i=CreateImage(#PB_Any,64,64)
       StartDrawing(ImageOutput(\i))
          Box(0,0,64,64,RGB(Random(255),Random(255),Random(255)))   
       StopDrawing()
       
       \g=ImageGadget(#PB_Any,10+70*i,10,64,64,ImageID(\i))
       EndWith       
    Next
    
    
    CloseGadgetList()
    
    SetGadgetColor(10,#PB_Gadget_BackColor,RGB(255,255,240))
    
       
Repeat
    Event = WaitWindowEvent(20)
    
    If Event = #PB_Event_Gadget
      
      GadgetNr=EventGadget()
       
       ForEach GID()
         If GadgetNr=GID()\g
         If EventType() = #PB_EventType_DragStart
              DragGadgetID=GID()\g
              DragImageID=GID()\i
              SetGadgetState(DragGadgetID,ImageID(DragImageID))
              DragText(".") ;/ Damit DragDrop-Action ausgeführt wird             
         EndIf
         EndIf
       Next  
     
        
    EndIf   
    If Event = #PB_Event_GadgetDrop
        ResizeGadget(DragGadgetID,EventDropX()-#XAusrichtung,EventDropY()-#YAusrichtung,#PB_Ignore,#PB_Ignore)
        
    EndIf
    
    If IsWindow(0)
      CloseWindow(0)
    EndIf
    
    
Until Event = #PB_Event_CloseWindow

:freak:

Verfasst: 11.02.2008 17:43
von roherter
Mir fällt jetzt auf anhieb nur ein ein Borderles window mit imagegadget zu verwenden das der Maus folgt!

Verfasst: 11.02.2008 19:26
von Xaby
Joa, mit einem Fenster ist es wohl möglich.
Aber das ist sicherlich nicht so gedacht.

Erstens verliert das Hauptfenster ja dann immer den Fokus, das könnte man auch noch mit einem Trick umgehen und zweitens wird auch nicht immer die DragCallback-Funktion aufgerufen, und dann hängt das Fenster dem Mauszeiger hinterher.

Hat jemand Lösungsvorschläge wie man ein Explorerfenster mit Miniaturansicht und dem Verschieben von kleinen Bildchen nachbauen kann?

Cool wäre natürlich auch, wenn man das mit eigenen Gadgets machen kann.

:o

Verfasst: 29.02.2008 14:50
von Xaby
Keiner eine weitere Idee, die schicker ist? :(

Verfasst: 24.06.2008 11:57
von Xaby
Tja, vielleicht stelle ich die falschen Fragen :(

Ist jemand schon mal auf Code gestoßen, der das freie Verschieben von Icons in einem Gadget ermöglicht?

Ich möchte etwas änliches wie in einem Datei-Ordnerfenster
(Explorer, Arbeitsplatz) haben, wo ich die Symbole frei verschieben und anordnen kann. Oder so wie auf dem Desktop ohne Einrasten.

Die einzige Alternative, die mir dazu einfällt wäre, alles über den Grafikmodus zu machen und dann mit Sprites zu arbeiten und die Drag'n'Drop-Operation selbst zu schreiben.

Aber dann muss ich auf die Einfachheit einiger Gadgets verzichten, was auch wieder doof wäre. Und unter Umständen wäre es langsam.

Ich muss ja das Rad nicht neu erfinden.

Ich will eigentlich Bilder oder Icons frei auf einem anderen Bild anordnen können. Aber möglichst ohne auf die 2D-Draw-Image-Befehle zurück greifen zu müssen, weil die langsam sind und den Speicher wieder voll machen.

Weiß jemand, was ich meine? Hat jemand eine Idee? :freak:

Büdde :oops: