Seite 1 von 1

Ereignisbehandlung bei Klick mit rechter Maustaste auf Gadge

Verfasst: 14.06.2007 14:54
von PSi
Hallo Leute,

bin (Achtung, Wortspiel :D ) purer Anfänger :(

Ich experimentiere etwas mit PureBasic (3.3 & 4.0) und komme an einigen Stellen nicht weiter, vor allem was das Event-Handling angeht, ich hoffe ihr könnt mir weiterhelfen ...

Habe ein Fenster mit einem Listview- und einem Button-Objekt. Wenn der User mit der rechten Maustaste auf mein Listview-Objekt klickt, soll irgendeine Prozedur aufgerufen werden; Doch wie geht das?

Hier mein Beispiel-Code:

Code: Alles auswählen

...
Repeat

  Event = WaitWindowEvent()
  
  Select Event
    
    Case #PB_Event_Gadget
      
      Select EventGadget()
        
        Case Listview_0

          Select EventType()

            Case #PB_EventType_LeftClick
               ListView_0_OnClick() ;Prozedur aufrufen

            Case #PB_EventType_RightClick
               ListView_0_OnRightClick() ;GEHT NICHT !!!

          EndSelect ; von EventType() / Listview_0

          
        Case Button_0
          Select EventType()

            Case #PB_EventType_LeftClick
                 Button_0_OnClick()

            Case #PB_EventType_RightClick
                 Button_0_OnRightClick() ;DAS GEHT AUCH NICHT !!!

          EndSelect ; von EventType() / Button_0

      EndSelect ; EventGadget
      
  EndSelect ; Event
  
Until Event = #PB_Event_CloseWindow
...
Kann mir jemand helfen? Vielen Dank im Voraus

Gruß
PSi

Re: Ereignisbehandlung bei Klick mit rechter Maustaste auf G

Verfasst: 14.06.2007 15:25
von Kiffi
PSi hat geschrieben:Doch wie geht das?
als erstes in die Hilfe schauen. Dort stehen unter ListViewGadget() die
Liste der unterstützten EventTypes:
#PB_EventType_LeftClick
#PB_EventType_LeftDoubleClick
... also kein #PB_EventType_RightClick

Und unter EventType() selber stehen die unterstützten Gadgets
- ExplorerListGadget()
- ExplorerTreeGadget()
- ImageGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- SpinGadget()
- StringGadget()
... also kein ButtonGadget.

Du musst auf #WM_RBUTTONDOWN bzw. #WM_RBUTTONUP prüfen.

Code: Alles auswählen

Procedure MouseOverGadget(GadgetID)
  If WindowMouseX()>GadgetX(GadgetID) And WindowMouseX()<GadgetX(GadgetID)+GadgetWidth(GadgetID) And WindowMouseY()>GadgetY(GadgetID) And WindowMouseY()<GadgetY(GadgetID)+GadgetHeight(GadgetID)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure 

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event

    Case #WM_RBUTTONDOWN  ; bzw #WM_RBUTTONUP
      
      If MouseOverGadget(Button_0)
        
        ; TaDa!
      
      Else
        
        ; hier gucken: http://www.purebasic.fr/english/viewtopic.php?p=197999#197999
        
      EndIf
      
  EndSelect ; Event
  
Until Event = #PB_Event_CloseWindow
Grüße ... Kiffi

Verfasst: 14.06.2007 15:39
von Sicro

Code: Alles auswählen

Repeat

  Event = WaitWindowEvent()
  
  If Event = #WM_RBUTTONDOWN
    GetCursorPos_(@Pos.POINT)
    Select WindowFromPoint_(Pos\x,Pos\y)
      Case GadgetID(Listview_0)
        ListView_0_OnRightClick()
      Case GadgetID(Button_0)
        Button_0_OnRightClick()
    EndSelect
  EndIf
    
  Select Event
   
    Case #PB_Event_Gadget
     
      Select EventGadget()
       
        Case Listview_0

          Select EventType()

            Case #PB_EventType_LeftClick
               ListView_0_OnClick() ;Prozedur aufrufen

            ;Case #PB_EventType_RightClick
               ;ListView_0_OnRightClick() ;GEHT NICHT !!!

          EndSelect ; von EventType() / Listview_0

         
        Case Button_0
          ;Select EventType()

            ;Case #PB_EventType_LeftClick
            ;Bei PB ist ein Button-Event immer ein Linksklick
                 Button_0_OnClick()

            ;Case #PB_EventType_RightClick
                 ;Button_0_OnRightClick() ;DAS GEHT AUCH NICHT !!!

          ;EndSelect ; von EventType() / Button_0

      EndSelect ; EventGadget
     
  EndSelect ; Event
 
Until Event = #PB_Event_CloseWindow
Mfg DerProgger

Verfasst: 14.06.2007 16:39
von PSi
DANKE FÜR DIE ANTWORTEN UND LÖSUNGEN !!!
Kiffi hat geschrieben: als erstes in die Hilfe schauen. Dort stehen unter ListViewGadget() die Liste der unterstützten EventTypes:
...
hier gucken: http://www.purebasic.fr/english/viewtop ... 999#197999
@Kiffi:
habe wirklich in die Hilfe geschaut, ehrlich - doch dass muss ich irgendwie übersehen haben - sorry :oops:
trotzdem Danke ...

DerProgger hat geschrieben:

Code: Alles auswählen

If Event = #WM_RBUTTONDOWN 
    GetCursorPos_(@Pos.POINT) 
    Select WindowFromPoint_(Pos\x,Pos\y) 
      Case GadgetID(Listview_0) 
        ListView_0_OnRightClick() 
      Case GadgetID(Button_0) 
        Button_0_OnRightClick() 
    EndSelect 
  EndIf 
@DerProgger:
OK, damit funktioniert es recht gut - vielen Dank nochmal !!!



nur für den Fall dass es euch interessiert:

Ich erstelle ein kleines Programm zu Übungszwecken, welches mir alle Dienste anzeigt und ich diese stoppen und (neu)starten kann.

Ich verwende dafür die PBOSL http://www.pbosl.purearea.net/.

Im Listview-Objekt werden alle Dienste aufgelistet; mit Rechtsklick soll ein PopUp-Menü erscheinen mit den entsprechenden Einträgen.

In der ersten Version (da habe ich in die Hilfe-Datei geschaut :) ) war ja auch alles wunderbar, nur das PopUp-Menü erschien überall; auch beim Klicken mit der rechten Maustaste auf das Fenster.

Jetzt ist aber, dank euch, alles schön - wenn ich mit meinen Übungen fertig bin, poste ich den Quelltext für PB-Einsteiger (wenn überhaupt Bedarf besteht 8) ) ...

OK, vielen Dank noch mal und einen schönen Tag noch ...

Gruß
PSi