Wie kann ich ICONs dragen und droppen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Wie kann ich ICONs dragen und droppen?

Beitrag 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:
Zuletzt geändert von Xaby am 11.02.2008 19:21, insgesamt 2-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Mir fällt jetzt auf anhieb nur ein ein Borderles window mit imagegadget zu verwenden das der Maus folgt!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Keiner eine weitere Idee, die schicker ist? :(
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Antworten