Rechtsklick-Event erkennen in Combobox

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Laut Hilfe duerfte da aber gar kein weiteres Event ankommen.

nur weil es nicht erwähnt ist, heißt das nicht,
dass kein event ankommt und die schleife nicht durchlaufen wird.

unter Windows ist es sogar ein event, wenn man die maus über das fenster hinwegbewegt,
also ein simples mouseover über dem fensterhintergrund.

enscheinend geht es ja um win-only, wenn John eine WinAPI-lösung in betracht zieht.

allerdings kommt mir diese MouseOver-ermittlung mit den drei API-calls doch recht aufwendig vor,
viel zu aufwendig für jeden durchlauf.
wenn man die benutzen will dann sollte man zuerst den VirtualKey ermitteln.

den ganzen sumps spart man sich bei nem Callback, insofern ist deine lösung schon sympatisch.
allerdings vermisse ich dort irgendwie die ermittlung des aktuellen Gadgets....
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 »

den ganzen sumps spart man sich bei nem Callback, insofern ist deine lösung schon sympatisch.
allerdings vermisse ich dort irgendwie die ermittlung des aktuellen Gadgets....
Hast du vielleicht nen Beispielcode für mich ???
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau mal am ende der vorherigen seite, ich bezog mich auf das beispiel von edel.
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 »

Ich werds mal versuchen.
Recht herzlichen Dank an alle, die sich an der Lösung meines Problems beteiligt haben.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@John Doe: Dann wollen wir mal hoffen, dass die Anwender Deines
Programmes diese mühsam erarbeitete Funktionalität auch nutzen, denn
zumindest ich bin noch nie auf die Idee gekommen, mit der rechten
Maustaste auf eine Combobox zu klicken ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

@Kaeru Gaman
Wir reden hier aber nicht ueber die Events die Windows anbietet sondern
die die von PB unterstuetzt werden. Aber der Code ist eh am Thema
vorbei.

Hier mal was neues :

Code: Alles auswählen

Structure COMBOBOXINFO
  cbSize.l
  rcItem.RECT
  rcButton.RECT
  stateButton.l
  hwndCombo.l
  hwndItem.l
  hwndlist.l
EndStructure

Prototype callback(hwnd,msg,wParam,lParam)

Procedure CatchRClick(hwnd,msg,wParam,lParam)
  Shared old.callback
  
  If msg = #WM_RBUTTONDOWN
    Debug "right mouse down"
  EndIf
  
  ProcedureReturn old(hwnd,msg,wParam,lParam)
EndProcedure


hwnd = OpenWindow(0,0,0,200,200,"")

CreateGadgetList(hwnd)
ComboBoxGadget(0,10,10,100,100)

cbi.COMBOBOXINFO\cbSize = SizeOf(COMBOBOXINFO)
GetComboBoxInfo_(GadgetID(0),cbi)
old = SetWindowLong_(cbi\hwndlist,#GWL_WNDPROC,@CatchRClick())

Repeat
  e = WaitWindowEvent()
  
Until e = 16
Zuletzt geändert von edel am 08.03.2007 20:36, insgesamt 1-mal geändert.
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 auf Combo kann man erfassen, aber auf Item nicht!!!
Edels Code angepaßt:

Code: Alles auswählen

Prototype callback(hwnd,msg,wParam,lParam)

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

#PB_EventType_MyRightClick = #WM_USER + 10
Procedure CBcallback(hwnd,msg,wParam,lParam)
  Shared old.callback
 
  If msg = #WM_RBUTTONDOWN
    PB_Gadget_SendGadgetCommand(hwnd,#PB_EventType_MyRightClick)
  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)
            Case #PB_EventType_MyRightClick
              Debug "Rechtsclick auf Combo"
          EndSelect
         
      EndSelect
     
  EndSelect
 
Until EventID = #PB_Event_CloseWindow

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

Beitrag von edel »

Hier noch einmal mit Menu :

Code: Alles auswählen

Structure COMBOBOXINFO
  cbSize.l
  rcItem.RECT
  rcButton.RECT
  stateButton.l
  hwndCombo.l
  hwndItem.l
  hwndlist.l
EndStructure

Prototype callback(hwnd,msg,wParam,lParam)

Macro loword(Value)
  Value & $FFFF
EndMacro
  
Macro hiword(Value)
  (Value >> 16) & $FFFF
EndMacro 
  

Procedure CatchRClick(hwnd,msg,wParam,lParam)
  Shared old.callback 
  Static openMenu
  
  Select msg
    Case #WM_CAPTURECHANGED
      If openMenu = #True
        ProcedureReturn 0
      EndIf 
    Case #WM_RBUTTONDOWN
      openMenu = #True
      DisplayPopupMenu(0,hwnd)   
    Case #WM_UNINITMENUPOPUP
      openMenu = #False 
  EndSelect
  
  If msg = #WM_COMMAND
    
    id   = hiword(wParam)
    code = loword(wParam)
    
    If id = 0 ; 0 = Menu
      
      Select code
        Case 1  
          RemoveGadgetItem(0,GetGadgetState(0))
      EndSelect
      
    EndIf
    
  EndIf
  
  ProcedureReturn old(hwnd,msg,wParam,lParam)
EndProcedure

hwnd = OpenWindow(0,0,0,200,200,"")

CreateGadgetList(hwnd)
ComboBoxGadget(0,10,10,100,100)
AddGadgetItem(0, -1, "ComboBox Item 1")
AddGadgetItem(0, -1, "ComboBox Item 2")
AddGadgetItem(0, -1, "ComboBox Item 3")
AddGadgetItem(0, -1, "ComboBox Item 4") 

CreatePopupMenu(0)
MenuItem(1, "löschen")

cbi.COMBOBOXINFO\cbSize = SizeOf(COMBOBOXINFO)
GetComboBoxInfo_(GadgetID(0),cbi)
old  = SetWindowLong_(cbi\hwndlist,#GWL_WNDPROC,@CatchRClick())

Repeat
  e = WaitWindowEvent()
  
Until e = 16
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

und auch das funktioniert ohne Callback:

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()
  
      If EventID= #WM_RBUTTONDOWN And EventGadget()=2 
      MessageRequester("Gadget","RechtsClick Button",0)
      EndIf
  
  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
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

dysti hat geschrieben:und auch das funktioniert ohne Callback
Das sind alles Nachrichten die nicht von WindowEvent() bzw PB unterstuetzt
werden, deswegen ein Callback. Ich glaube zwar nicht das Fred die
Nachrichten nicht mehr durchlaesst, aber man kann ja nie wissen.
Antworten