Seite 2 von 2
Verfasst: 08.03.2007 20:18
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....
Verfasst: 08.03.2007 20:21
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 ???
Verfasst: 08.03.2007 20:24
von Kaeru Gaman
schau mal am ende der vorherigen seite, ich bezog mich auf das beispiel von edel.
Verfasst: 08.03.2007 20:32
von John Doe
Ich werds mal versuchen.
Recht herzlichen Dank an alle, die sich an der Lösung meines Problems beteiligt haben.
Verfasst: 08.03.2007 20:33
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
Verfasst: 08.03.2007 20:35
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
Verfasst: 08.03.2007 20:36
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
Verfasst: 08.03.2007 21:37
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
Verfasst: 09.03.2007 11:50
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
Verfasst: 09.03.2007 16:20
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.