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.