Drag'n Drop: Mauszeiger während des Drag-Vorgangs ändern?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Drag'n Drop: Mauszeiger während des Drag-Vorgangs ändern?

Beitrag von Kiffi »

Ist es möglich, bei DragFiles() den Mauszeiger (Copy oder Move) auch
während des Drag-Vorganges zu verändern, indem ich (wie im Explorer)
die Shift-Taste nachträglich drücke?

(basierend auf folgendem Drag and Drop-Code von ts-soft)

Code: Alles auswählen

If OpenWindow(0, 200, 200, 430, 400, "Drag & Drop", #PB_Window_SystemMenu)
  CreateGadgetList(WindowID(0))
  
  
  ExplorerListGadget(1, 10, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
  ExplorerListGadget(2, 210, 10, 200, 380, "*", #PB_Explorer_MultiSelect)
  
  EnableGadgetDrop(1, #PB_Drop_Files, #PB_Drag_Copy | #PB_Drag_Move)
  EnableGadgetDrop(2, #PB_Drop_Files, #PB_Drag_Copy | #PB_Drag_Move)
  
  Repeat

    event = WaitWindowEvent(0)
    
    If event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Files$ = ""
      
      If EventGadget() = 1    ;wird beim drag vom ExplorerList 1 ausgeführt
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
          EndIf
        Next i
        Debug Files$
      EndIf
      
      
      If EventGadget() = 2    ;wird beim drag vom ExplorerList 1 ausgeführt
        For i = 0 To CountGadgetItems(2)-1
          If GetGadgetItemState(2, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(2) + GetGadgetItemText(2, i) + Chr(10)
          EndIf
        Next i
        Debug Files$
      EndIf
      
      DragFiles(Files$)
      
    ElseIf event = #PB_Event_GadgetDrop
      
      If EventGadget() = 1    ;wird beim drop im ExplorerList 1 ausgeführt
        Zieldatei$ = GetGadgetText(1)
        Dateien.s = EventDropFiles();
        Anzahl = CountString(Dateien, Chr(10)) + 1;
        Debug Zieldatei$
        For i = 1 To Anzahl
          Debug StringField(Dateien, i, Chr(10))
        Next
      EndIf
      
      If EventGadget() = 2    ;wird beim drop im ExplorerList 2 ausgeführt
        
        Zieldatei$ = GetGadgetText(2)
        Dateien.s = EventDropFiles();
        Anzahl = CountString(Dateien, Chr(10)) + 1;
        Debug Zieldatei$
        For i = 1 To Anzahl
          Debug StringField(Dateien, i, Chr(10))
        Next
      EndIf
    EndIf
    
  Until event = #PB_Event_CloseWindow
  
EndIf
Danke im voraus & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Also ich habe das mal ausprobiert im Explorer bei mir ändert sich kein Mauszeiger deswegen weiß ich jetzt nicht genau wie du das meinst?
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

roherter hat geschrieben:Also ich habe das mal ausprobiert im Explorer bei mir ändert sich kein Mauszeiger deswegen weiß ich jetzt nicht genau wie du das meinst?
Kopieren (Datei 'draggen' mit gedrückter Shift-Taste):

Bild

Beim Verschieben hingegen erscheint das 'Plus' nicht.

Ich möchte also während des Drag-Vorgangs (in Abhängigkeit, ob Shift
gedrückt wurde oder nicht) den Copy/Move-Modus ändern.

Grüße ... Kiffi
a²+b²=mc²
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Das Verschwinden des [+] läuft automatisch wenn die Tasten gedrückt werden,
aber nur wenn die gewünschte Aktion von Quelle und Ziel auch erlaubt wird.

So gehts:

Code: Alles auswählen

DragFiles(Files$, #PB_Drag_Copy|#PB_Drag_Move)
Default ist nur #PB_Drag_Move, desshalb hatte die Shift-Taste keine Wirkung, da
Verschieben keine gültige Aktion war.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

freak hat geschrieben:So gehts:

Code: Alles auswählen

DragFiles(Files$, #PB_Drag_Copy|#PB_Drag_Move)
Bingo! Danke für den Tipp! :allright:

Kurz zu meinem Vorhaben: Eigentlich plane ich für private Zwecke einen
simplen Dateimanager (à la Total Commander für Arme) mit speziellen
Funktionen. Ich würde mir seeehr viel Arbeit ersparen, wenn die beiden
ExplorerListGadgets 'richtige' Explorer-Instanzen wären. Hierzu war mein
erster Plan, 2 Explorer zu starten und diese mit SetParent in mein Fenster zu
verpflanzen, was sich aber als ziemlich schwierig erweist (siehe hierzu auch:
hWnd eines mit RunProgram() gestarteten Explorers ermitteln)

@freak:
Wenn ich 2 'richtige' Explorer-Instanzen hätte, könnte ich mir den Nachbau
deren Standardfunktionalitäten schon mal ersparen (Copy / Move /
Kontextmenü bei rechtem Mausklick, etc.) und sofort mit meinen speziellen
Funktionen loslegen können. Gibt's da einen Trick, der mir das
Programmieren erleichtern könnte?

Danke im voraus & Grüße ... Kiffi
a²+b²=mc²
Antworten