Rechtsklick-Event erkennen in Combobox
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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....
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.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@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 :
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.
- 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
Rechtsclick auf Combo kann man erfassen, aber auf Item nicht!!!
Edels Code angepaßt:
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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