Seite 1 von 2

Rechtsklick-Event erkennen in Combobox

Verfasst: 08.03.2007 19:32
von John Doe
Hallo an alle,
ich bin allmählich am verzweifeln.
Ich versuche einen Rechtsklick mit der Maus in einem Combobox-Gadget auszuwerten, aber es klappt nicht. Was mache ich falsch ?
Ich hab schon Beispiele aus der Purearea-Codebibliothek benutzt, die funktionieren bei mir jedoch nicht.

Code: Alles auswählen

OpenWindow(1,200, 200, 320,240,"Window",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
CreateGadgetList(WindowID(1))

CreateMenu(1, WindowID(1))
MenuTitle("File")
MenuItem(1,"New")
MenuItem(2,"Open")
MenuItem(3,"Save")

CreateToolBar(1, WindowID(1))
ToolBarStandardButton(4,#PB_ToolBarIcon_New)
ToolBarStandardButton(5,#PB_ToolBarIcon_Open)
ToolBarStandardButton(6,#PB_ToolBarIcon_Save)

ButtonGadget(1, 10, 30, 100, 25,"Button 1")

ComboBoxGadget(2, 10, 120, 100, 250)
AddGadgetItem(2, -1, "ComboBox Item 1") 
AddGadgetItem(2, -1, "ComboBox Item 2") 
AddGadgetItem(2, -1, "ComboBox Item 3") 
AddGadgetItem(2, -1, "ComboBox Item 4") 

Repeat
  EventID = WaitWindowEvent()
  
  Select EventID
    ; Menu/ToolBarEvent
    Case #PB_Event_Menu
      MessageRequester("Menu or Toolbar","Item #: "+Str(EventGadget()),0)
    
    ; GadgetsEvents
    Case #PB_Event_Gadget
      
      Select EventGadget()
        
        ; ButtonGadget
        Case 1
          Select EventType()
            Case #PB_EventType_LeftClick
              MessageRequester("Gadget","Button",0)
          EndSelect
    
        ; ComboBoxGadget
        Case 2
          Select EventType()
            Case #PB_EventType_RightClick
              MessageRequester("Gadget","ComboBox",0)
          EndSelect
    
      EndSelect
    
  EndSelect
  
Until EventID = #PB_Event_CloseWindow

End
Ich benutze Purebasic V4.02 und hatte auch schon mit und ohne XP-Skin-Unterstützung probiert, jedoch ohne Erfolg.

Verfasst: 08.03.2007 19:45
von edel
Unter Eventtype steht doch welches Gadget unterstuetzt wird.

Aber versuch es mal so :


Code: Alles auswählen

Prototype callback(hwnd,msg,wParam,lParam)

Import "Gadget.lib"
  PB_Gadget_SendGadgetCommand(hwnd,event)
EndImport

Procedure CBcallback(hwnd,msg,wParam,lParam)
  Shared old.callback
  
  If msg = #WM_RBUTTONDOWN 
    PB_Gadget_SendGadgetCommand(hwnd,#PB_EventType_RightClick)
  EndIf
  
  ProcedureReturn old(hwnd,msg,wParam,lParam)
EndProcedure

OpenWindow(1,200, 200, 320,240,"Window",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
CreateGadgetList(WindowID(1))

CreateMenu(1, WindowID(1))
MenuTitle("File")
MenuItem(1,"New")
MenuItem(2,"Open")
MenuItem(3,"Save")

CreateToolBar(1, WindowID(1))
ToolBarStandardButton(4,#PB_ToolBarIcon_New)
ToolBarStandardButton(5,#PB_ToolBarIcon_Open)
ToolBarStandardButton(6,#PB_ToolBarIcon_Save)

ButtonGadget(1, 10, 30, 100, 25,"Button 1")

ComboBoxGadget(2, 10, 120, 100, 250)
AddGadgetItem(2, -1, "ComboBox Item 1")
AddGadgetItem(2, -1, "ComboBox Item 2")
AddGadgetItem(2, -1, "ComboBox Item 3")
AddGadgetItem(2, -1, "ComboBox Item 4")

old = SetWindowLong_(GadgetID(2),#GWL_WNDPROC,@CBcallback())



Repeat
  EventID = WaitWindowEvent()
  
  Select EventID
    ; Menu/ToolBarEvent
    Case #PB_Event_Menu
      MessageRequester("Menu or Toolbar","Item #: "+Str(EventGadget()),0)
      
      ; GadgetsEvents
    Case #PB_Event_Gadget
      
      Select EventGadget()
        
        ; ButtonGadget
        Case 1
          Select EventType()
            Case #PB_EventType_LeftClick
              MessageRequester("Gadget","Button",0)
          EndSelect
          
          ; ComboBoxGadget
        Case 2
          Select EventType()
            Case #PB_EventType_RightClick
              MessageRequester("Gadget","ComboBox",0)
          EndSelect
          
      EndSelect
      
  EndSelect
  
Until EventID = #PB_Event_CloseWindow

End

Verfasst: 08.03.2007 19:45
von ts-soft
Rechtsclick event wird ausgelöst, wenn ein Item gechanged wurde. Kannst
also schlecht verwenden.

Verfasst: 08.03.2007 19:54
von Kaeru Gaman
ts-soft hat geschrieben:Rechtsclick event wird ausgelöst, wenn ein Item gechanged wurde. Kannst
also schlecht verwenden.
und wenn man zusätzlich noch auf #VK_RBUTTON checkt?
als unterscheidung, ob der ermittelte "rechtsclick" nun ein echter rechtsclick oder ein itemchange ist....

Verfasst: 08.03.2007 19:56
von John Doe
Dann ist das wohl ein Fehler im Beispiel, wenn #PB_EventType_RightClick abgefragt wird:

Code: Alles auswählen

Case 2
          Select EventType()
            Case #PB_EventType_RightClick
              MessageRequester("Gadget","ComboBox",0)
          EndSelect 
Das Beispiel von Edel funktioniert, allerdings nur wenn ein Rechtsklick auf ein noch geschlossenes Combobox-Gadget angewendet wird.
In einer aufgeklappten Combobox triit keine Reaktion auf.Ich möchte jedoch das Event benutzen, um in einer aufgeklappten Combobox mittels Rechtsklick ein Popup-Menü anzeigen zu lassen.

Verfasst: 08.03.2007 19:57
von ts-soft
Ich denke mal, das die Combobox Designmässig nicht für rechtsclick
konzipiert wurde. Sicher kann man irgendwie Tricksen, also gedrückte Taste
testen.

Verfasst: 08.03.2007 20:00
von Kaeru Gaman
nuja.. das problem ist EventType:

Code: Alles auswählen

Die folgenden Gadgets unterstützen EventType(): 

- ExplorerListGadget() 
- ExplorerTreeGadget() 
- ImageGadget() 
- ListViewGadget() 
- ListIconGadget() 
- MDIGadget() 
- SpinGadget() 
- StringGadget() 
da ist combobox nicht mit bei.

(mist, ts war schneller... :mrgreen: )

irgendwie muss man ja ein mouseover ermitteln können für das gadget.
für den fall kann man dann auch die gedrückte taste ermitteln.

da das allerdings wohl sowieso nur über API funktioniert,
kann man auch gleich gucken, obs vom Combobox auch ne Message gibt bei rechtsclick...

Verfasst: 08.03.2007 20:00
von ts-soft
John Doe hat geschrieben:Dann ist das wohl ein Fehler im Beispiel, wenn #PB_EventType_RightClick abgefragt wird:

Code: Alles auswählen

Case 2
          Select EventType()
            Case #PB_EventType_RightClick
              MessageRequester("Gadget","ComboBox",0)
          EndSelect 
Das Beispiel von Edel funktioniert, allerdings nur wenn ein Rechtsklick auf ein noch geschlossenes Combobox-Gadget angewendet wird.
In einer aufgeklappten Combobox triit keine Reaktion auf.Ich möchte jedoch das Event benutzen, um in einer aufgeklappten Combobox mittels Rechtsklick ein Popup-Menü anzeigen zu lassen.
Normal reagiert die Combobox, wenn Du sie anklickst zum Öffnen usw. und beim Itemwechsel. Wenn Du nur den Itemwechsel brauchst (meist ist das so)
dann kannste Rechtsclick abfragen. Aber das normalle Rechtsclickevent funktioniert mit Combobox nicht, da mußte also Tricksen.

Verfasst: 08.03.2007 20:02
von John Doe
Ich hab da mal eine Funktion, mit der ich feststellen kann, ob sich die Maus über der Combobox befindet, so ne Art 'MouseOverGadget'-Funktion mit Rückgabe #True oder #False.
Kann ich die vielleicht benutzen in Zusammenhang mit 'rechte Maustaste gedrückt' ?
Wie kann ich das abfangen ?

Ich hab die Funktion mal nachträglich eingestellt:

Code: Alles auswählen

Procedure.b IsMouseOverGadget(Gadget.l)
 
GetWindowRect_(GadgetID(Gadget),re.RECT)  
GetCursorPos_(pt.POINT)  
result = PtInRect_(re,pt\x,pt\y)
  
ProcedureReturn result 
     
EndProcedure 

Verfasst: 08.03.2007 20:02
von edel
Laut Hilfe duerfte da aber gar kein weiteres Event ankommen.

Entweder sendet man gleich rbuttondown oder man benutzt den Code
im Callback (was wohl am besten ist) .

Beispiel :

Code: Alles auswählen


Procedure CBcallback(hwnd,msg,wParam,lParam)
  Shared old.callback
  
  If msg = #WM_RBUTTONDOWN 
    PB_Gadget_SendGadgetCommand(hwnd,#WM_RBUTTONDOWN)
  EndIf
  
  ProcedureReturn old(hwnd,msg,wParam,lParam)
EndProcedure

Code: Alles auswählen

Procedure CBcallback(hwnd,msg,wParam,lParam)
  Shared old.callback
  
  If msg = #WM_RBUTTONDOWN 
    MessageRequester("Gadget","ComboBox",0)
  EndIf
  
  ProcedureReturn old(hwnd,msg,wParam,lParam)
EndProcedure