Seite 1 von 1

Konstante - Drag gestartet

Verfasst: 26.04.2013 21:34
von BSP
Hallo.
Kennt jemannd die Windoweventkonstante für:
"Drag gestartet" bzw. "Drag im Gange" ?

Wenn ich eine Drag&Drop operation gestartet habe,
z.B. von einem Windowobjekt zu einem PB- Objekt,
liefert PB erst ein neues Event , wenn ich die Operation beendet habe.
Also bei "Drop" on Gadget oder Window.

Window selber liefert anscheinend die Nummer 1024 zurück.

Könnt ihr helfen?
Danke:
Bernd

Re: Konstante - Drag gestartet

Verfasst: 26.04.2013 21:57
von BSP
Hier noch ein kurzes Prg zur Veranschaulichung:

Code: Alles auswählen


; Gadgets
Enumeration
  #anzeige
EndEnumeration
Global gadgstart = #PB_Compiler_EnumerationValue 

Global NewList id()

Procedure GadgetUnterMaus(id)
  GetWindowRect_(GadgetID(id),re.RECT)
  GetCursorPos_(pt.POINT)
  If PtInRect_(re, pt\y << 32 + pt\x) = 1
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure draw(id.i, txt.s, col.i)
  If Not IsGadget(id):ProcedureReturn 0:EndIf
  
  StartDrawing(CanvasOutput(id))
  Box(0,0,GadgetWidth(id),GadgetHeight(id),col)
  x = (GadgetWidth(id) - TextWidth(txt)) /2
  y = (GadgetHeight(id) - TextHeight(txt)) /2
  DrawText(x,y,txt,0,col)
  StopDrawing()
  
EndProcedure

OpenWindow(0,0,0,200,300,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
For i = 0 To 4
  AddElement(id())
  id() = gadgstart + i
  CanvasGadget(id(), 10, 10 + i * 40, 160, 24)
  EnableGadgetDrop(ID(), #PB_Drop_Text | #PB_Drop_Files, #PB_Drag_Copy)
Next
CanvasGadget(#anzeige, 10, 10 + i * 40, 160, 24)
  
id_alt=-1

Repeat
ev = WaitWindowEvent(20)
Debug ev
Select ev
Case #PB_Event_CloseWindow
  ende=1
  
Case #PB_Event_Gadget
  ForEach id()
    If EventGadget() = id()
      draw(#anzeige, "EventType() = " +Str(EventType()), RGB(255,255,255))
      Select EventType()
      Case #PB_EventType_MouseLeave
        draw(id(), "", RGB(255,255,255))
        id_alt=-1
        
      Case #PB_EventType_MouseEnter
        draw(id(), "Betreten", RGB(0,255,0))
      
      Case #PB_EventType_DragStart
        draw(id(), "Drag gestartet", RGB(0,255,0))
      
      Default
      
      EndSelect
      Break
    EndIf
  Next
  
Case 1024 ; Drag am Laufen
  ForEach id()
    If GadgetUnterMaus(id())
      If id_alt <> id()
        draw(id_alt, "", RGB(255,255,255))
        draw(id(), "Drag läuft", RGB(175, 238, 238))
        id_alt = id()
        Break
      EndIf
    EndIf
  Next        
    
Case #PB_Event_GadgetDrop
  ForEach id()
    If EventGadget() = id()
      If EventDropType() = #PB_Drop_Files
        draw(id(), EventDropFiles(), RGB(0,255,0))
        draw(#anzeige, "DropOnGadget", RGB(255,255,255))
      EndIf
      ;id_alt=-1
      Break
    EndIf
  Next  

Default

  ;DragOverId_alt=-1

EndSelect
Until ende

Bernd

Re: Konstante - Drag gestartet

Verfasst: 27.04.2013 11:29
von Andesdaf
hilft dir EventType() mit #PB_Event_DragStart?

Re: Konstante - Drag gestartet

Verfasst: 27.04.2013 23:15
von BSP
Hallo Andesdaf.
Nein, Dein Tip hilft leieder nicht,
weil es die Konstante in PB (5.11) nicht gibt.

Ich habe mein Prg oben noch mal erweitert.
Fahrt Ihr mit der Maus über das Fenster, reagiert
"WaitWindowEvent()"
mit verschiedenen möglichkeiten.
Zieht nun mal ein Desktopobjekt über das Fenster.
Wenn Ihr damit über ein Empfangsbereites Gadget fahrt, liefert
"WaitWindowEvent()" die Werte 1024 und 0 zurück.

Hintergrund meines Themas:
Ich möchte gerne, das mein Prg auch bei einer von Windows kommenden Drag/Drop Operation reagiert.
Z.B. und die Objekte zu Markieren, über der sich die Maus gerade befindet.

Na, ja. Reagiere ich auf das Event 1024, scheint es ja zu funktionieren.

Gruß & Dank:
Bernd

Re: Konstante - Drag gestartet

Verfasst: 28.04.2013 00:26
von Kiffi
BSP hat geschrieben:Hallo Andesdaf.
Nein, Dein Tip hilft leieder nicht,
weil es die Konstante in PB (5.11) nicht gibt.
Andesdaf meinte sicherlich #PB_EventType_DragStart

Grüße ... Kiffi

Re: Konstante - Drag gestartet

Verfasst: 28.04.2013 00:39
von freak

Re: Konstante - Drag gestartet

Verfasst: 28.04.2013 04:08
von BSP
Hallo.
@Kiffi
BSP hat geschrieben:
Hallo Andesdaf.
Nein, Dein Tip hilft leieder nicht,
weil es die Konstante in PB (5.11) nicht gibt.

Andesdaf meinte sicherlich #PB_EventType_DragStart
In meinem oben erweitertem Beispiel verwende ich die Konstante
"#PB_EventType_DragStart" bereits.
Ich benutze dort aber auch ein CanvasGadget.
Und das schein keine Drag- Operationen zu kennen.
Oder habe ich da schon wieder was übersehen?
(Im übersehen bin ich ja der Grösste. Schmunzel)

Dann:
Während einer laufenden Drag/Drop Op. geben PB- Events zurück:
- Bei einer Op von innerhalb des eigenem Prgs:
Nichts. Die Debugerausgabe steht still, bis ich die Maustaste wieder los lasse.

- Bei einer von aussen kommenden OP z.B. von WORD,:
1024

Der Mauszeiger ändert sich, das ist ja auch richtig.
Aber ich erhalte sonst keine weiteren Events,
um z.B. ein Feld unter der Maus zu Markieren.

Hier noch ein kleines Beispiel mit einem ImageGadget,
das den Drag- Start erkennt. Im Gegensatz zum Canvas.

Gruß:
Bernd

Code: Alles auswählen

; Gadgets
Enumeration
  #anzeige
EndEnumeration
Global gadgstart = #PB_Compiler_EnumerationValue 

Structure img
  gadgid.i
  imgid.i
EndStructure
Global NewList id.img()

Procedure GadgetUnterMaus(id)
  GetWindowRect_(GadgetID(id),re.RECT)
  GetCursorPos_(pt.POINT)
  If PtInRect_(re, pt\y << 32 + pt\x) = 1
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure draw(gadgid.i, imgid, txt.s, col.i)
  If Not IsImage(imgid):ProcedureReturn 0:EndIf
  
  StartDrawing(ImageOutput(imgid))
  Box(0,0,ImageWidth(imgid),ImageHeight(imgid),col)
  x = (ImageWidth(imgid) - TextWidth(txt)) /2
  y = (ImageHeight(imgid) - TextHeight(txt)) /2
  DrawText(x,y,txt,0,col)
  StopDrawing()
  SetGadgetState(id()\gadgid, ImageID(imgid))
EndProcedure

OpenWindow(0,0,0,200,300,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
For i = 0 To 4
  AddElement(id())
  id()\imgid  = gadgstart + i
  CreateImage(id()\imgid, 160, 24)
  id()\gadgid = gadgstart + i
  ImageGadget(id()\gadgid, 10, 10 + i * 40, 160, 24, ImageID(id()\imgid))
  EnableGadgetDrop(id()\gadgid, #PB_Drop_Image, #PB_Drag_Copy)
  
  draw(id()\gadgid, id()\imgid, "Feld : "+Str(i), RGB(255,255,255))
Next
  
id_alt=-1

Repeat
ev = WaitWindowEvent(20)
Debug ev
Select ev
Case #PB_Event_CloseWindow
  ende=1
  

Case #PB_Event_Gadget
  ForEach id()
    If EventGadget() = id()\gadgid
      Select EventType()
      Case #PB_EventType_DragStart
        DragImage(ImageID(ID()\imgid),#PB_Drag_Copy)
      EndSelect
      Break
    EndIf
  Next
  
Case 1024 ; Drag am Laufen
;   ForEach id()
;     If GadgetUnterMaus(id()\gadgid)
;       If id_alt <> id()\gadgid
;         draw(id_alt, "", RGB(255,255,255))
;         draw(id()\imgid, "Drag läuft", RGB(175, 238, 238))
;         id_alt = id()\imgid
;         Break
;       EndIf
;     EndIf
;   Next        
;     
Case #PB_Event_GadgetDrop
  ForEach id()
    If EventGadget() = id()\gadgid
      If EventDropType() = #PB_Drop_Image
        EventDropImage(id()\imgid)
        SetGadgetState(id()\gadgid,ImageID(id()\imgid))
      EndIf
      Break
    EndIf
  Next  

EndSelect
Until ende