Rechtsklick-Event erkennen in Combobox

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Rechtsklick-Event erkennen in Combobox

Beitrag 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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Rechtsclick event wird ausgelöst, wenn ein Item gechanged wurde. Kannst
also schlecht verwenden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag 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 
Zuletzt geändert von John Doe am 08.03.2007 20:05, insgesamt 1-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Antworten