Seite 1 von 2

Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 14.07.2010 21:56
von hilpert
Hi
want to PopUp a Menu within the inner area of the given Window.
Das Beispiel von PureBasic 4.5 PopUpMenu funktioniert nicht
da die Konstante #WM_RButtonDown nicht bekannt unter MacOs 4.11 und PB 4.5
Frage also :
Wie kann nach einem WaitWindowEvent unter MacOs 4.11 erkannt werden,
ob eine MausTaste gedrückt wurde im Innern eines Fensters jedoch außerhalb von Gadgets ??

Code: Alles auswählen

If OpenWindow(0, 200, 200, 600, 520, "Popup-Menu Example")
    AddKeyboardShortcut(0,#PB_Shortcut_P,80)
    If CreatePopupMenu(0):MenuItem(1,"Open"):MenuItem(2,"Save"):MenuItem(3,"Quit"):EndIf
    Repeat
       Select WaitWindowEvent()
        ;Case #WM_RButtonDown:DisplayPopupMenu(0, WindowID(0)) ; right mouse button was clicked => Unknown Constant under MacOs !???????????????
              ;DisplayPopupMenu(0, WindowID(0))
        Case #PB_Event_Menu
          Select EventMenu()
            Case 80:DisplayPopupMenu(0,WindowID(0),200+100,200+100) ; PopUp with Key_p works
            Case 3 : Quit=1
          EndSelect
        Case #PB_Event_CloseWindow:Quit=1
      EndSelect
    Until Quit = 1
EndIf
__________________________________________________
Code-Tags hinzugefügt
14.07.2010
RSBasic

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 14.07.2010 22:00
von hilpert
Oups - ich meinte naturlich unter MacOs 10.4.11
Hilpert

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 15.07.2010 15:06
von bobobo
Hohl ihn Dir doch einfach

Code: Alles auswählen

OpenWindow(0,0,0,400,400,"wott?",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Repeat
  event=WaitWindowEvent()
  If event <> #PB_Event_CloseWindow
    Debug event
  Else
    End
  EndIf
ForEver

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 17.07.2010 10:35
von hilpert
hi, bobobo

; Gute Idee - gibt leider hier kein Ergebnis ...
; erhalte nämlich immer den Wert -1
; außer den Wert 5 bei Click auf den Header wo "Wott" steht. - egal ob RButton oder LButton
; erhalte immer nur den Wert -1 bei einem Click auf das weisse Feld darunter
; aber ich will ja den MausEvent bei einem Click irgendwo darunter auf dem weissen Feld des Fensters.
; und da wird scheinbar kein Event ausgegeben.
; ???
;
; ich habe Ihren Code auf meinem alten Windows-Rechner getestet.
; und in der Tat - da werden die MausClick-Events alle angezeigt mit den zugehörigen Werten
;
; Auf meinem MacMini mit MacOs X 4.11 und PB 4.5 passiert da gar nichts.
; Trotzdem muß es einen Trick geben, die MausClkick-Events zu erhalten ...
; denn alle sonstigen MacOs-Programme können das ja auch ...
;
; gruß hilpert

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 05.11.2010 17:06
von Lebostein
Gleiches Problem. Es gibt tatsächlich keine Lösung, einen einfachen Mausklick auf ein Fester abzufangen. Schon ne ziemliche Katastrophe. Im Moment scheitert mein aktuelles Projekt an diesem Umstand...

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 05.11.2010 18:05
von Vera
Hallo,

Das Problem gibt's wohl schon lange, und wenig Aussicht auf Lösung.
Aber vielleicht hilft Euch ja aktuell der Trick mit dem durchsichtigen Image weiter:
Opening a PopupMenu correctly on MacOS

Gruß ~ Vera

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 24.11.2010 23:20
von Shardik
Lebostein hat geschrieben:Gleiches Problem. Es gibt tatsächlich keine Lösung, einen einfachen Mausklick auf ein Fester abzufangen.
Schon ne ziemliche Katastrophe. Im Moment scheitert mein aktuelles Projekt an diesem Umstand...
Nicht jammern, sondern machen... :wink:
Ich habe gerade im englische Forum eine Lösung vorgestellt (die allerdings API-Aufrufe nutzt :twisted: )
und sogar Klicks auf die linke, mittlere und rechte Maustaste unterscheiden kann:
http://www.purebasic.fr/english/viewtop ... 52&start=3

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 02.01.2011 21:00
von babelfish
Danke Shardik....

War gerade auf der Suche nach einer Lösung...
und das mit den API-Aufrufen hab ich noch nicht behirnt *g*
:allright:

Dann kanns weitergehen mit meinem Point&Click-Adventure (seeehr frühe Alpha-Phase *g*)

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 26.04.2011 14:45
von delikanli_19_82
also ich hab das problem dadurch gelöst, das ich dem fenster einen container-gadget als hintergrund verpasst habe.

danach konnte ich mit den üblichen mouse-down und mouse-up api calls von mac die maustasten auf dem fenster abfangen.

um festzustellen, ob ein mdown bzw. mup auf einem gadget oder dem fenster selbst stattfindet, habe ich eine linkedlist definiert, in der ich alle gadget-ids aufliste. die liste wird bei jedem mdown durchlaufen und über eine over_gadget() funktion, musst schon selbst programmieren, kann ich feststellen, ob der besagte event auf einem bestimmten gadget ausgelöst wurde. mittels eines boolischen flags kann ich innerhalb der Foreach-schleife ermitteln, ob irgendein passendes gadget gefunden wurde.

wenn nicht, also der flag=#false ist, so wurde der besagte ereignis auf dem fenster selbst ausgelöst.

da mein projekt etwas zu umfangreich ist, kann ich dir datu kein code geben. aber ich habe zum thema mouse-events unter mac die folgende codegrundlage verwendet:

Code: Alles auswählen

#kEventClassMouse = 'mous'
#kEventClassControl = 'cntl'
#kEventMouseDown = 1
#kEventMouseUp = 2
#kEventMouseMoved = 5
#kEventMouseDragged = 6
#kEventControlTrackingAreaEntered = 23
#kEventControlTrackingAreaExited = 24

ImportC "/System/Library/Frameworks/Carbon.framework/Carbon"
   GetEventClass.i(inEvent.l)
   HIViewNewTrackingArea(inView.l, inShape.l, inID.q, *outRef)
EndImport

Structure EventTypeSpec
   eventClass.l
   eventKind.l
EndStructure

OpenWindow(0, 100,100, 300, 200, "Test Window")
ContainerGadget(0, 100, 100, 50, 50, #PB_Container_Single)

ProcedureCDLL CallBackEventsHandler(*nextHandler, theEvent, *CallBackProc)
   Static OnTheControl.b

   Select GetEventClass(theEvent)
      Case #kEventClassMouse
         If OnTheControl
            Select GetEventKind_(theEvent)
               Case #kEventMouseDown
                  Debug "MouseDown"
               Case #kEventMouseMoved, #kEventMouseDragged
                  Debug "MouseMove"
               Case #kEventMouseUp
                  Debug "MouseUp"
            EndSelect
         EndIf

      Case #kEventClassControl ;{
         Select GetEventKind_(theEvent)
            Case #kEventControlTrackingAreaEntered
               OnTheControl = #True
            Case #kEventControlTrackingAreaExited
               OnTheControl = #False
         EndSelect         
   EndSelect

  If *nexthandler : CallNextEventHandler_(*nextHandler, theEvent) : EndIf
EndProcedure

; Window handler
EventHandlerUPP = NewEventHandlerUPP_(@CallBackEventsHandler())
Events_Count = 4
Dim eventTypes.EventTypeSpec(Events_Count - 1)
eventTypes(0)\eventClass = #kEventClassMouse
eventtypes(0)\eventKind = #kEventMouseDown
eventTypes(1)\eventClass = #kEventClassMouse
eventtypes(1)\eventKind = #kEventMouseMoved
eventTypes(2)\eventClass = #kEventClassMouse
eventtypes(2)\eventKind = #kEventMouseDragged
eventTypes(3)\eventClass = #kEventClassMouse
eventtypes(3)\eventKind = #kEventMouseUp
InstallEventHandler_(GetWindowEventTarget_(WindowID(0)), EventHandlerUPP, Events_Count, @eventtypes(), @CallBackEventsHandler(), @handlerref)

; Gadget hanlder
EventHandlerUPP = NewEventHandlerUPP_(@CallBackEventsHandler())
Events_Count = 2
Dim eventTypes.EventTypeSpec(Events_Count - 1)
eventTypes(0)\eventClass = #kEventClassControl
eventtypes(0)\eventKind = #kEventControlTrackingAreaEntered
eventTypes(1)\eventClass = #kEventClassControl
eventtypes(1)\eventKind = #kEventControlTrackingAreaExited
HIViewNewTrackingArea(GadgetID(0), #Null, 0, #Null)
InstallEventHandler_(GetControlEventTarget_(GadgetID(0)), EventHandlerUPP, Events_Count, @eventtypes(), @CallBackEventsHandler(), @handlerref)

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
   EndSelect
ForEver
der original-threat ist im englsichen forum unter http://www.purebasic.fr/english/viewtop ... ilit=mouse zu erreichen.

ich hoffe, ich konnte helfen

mfg

kurt

Re: Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Verfasst: 30.04.2011 22:15
von Shardik
hilpert hat geschrieben:Wie kann nach einem WaitWindowEvent unter MacOs 4.11 erkannt werden,
ob eine MausTaste gedrückt wurde im Innern eines Fensters jedoch außerhalb von Gadgets ??
delikanli_19_82 hat geschrieben:also ich hab das problem dadurch gelöst, das ich dem fenster einen container-gadget als hintergrund verpasst habe.

danach konnte ich mit den üblichen mouse-down und mouse-up api calls von mac die maustasten auf dem fenster abfangen.
Um festzustellen, ob ein Mausklick auf ein Fenster oder ein Gadget erfolgte, kann man es so machen, wie delikanli_19_82 es beschrieben hat, indem man ein ContainerGadget verwendet, das das ganze Fenster abdeckt. Vera hat auch schon einmal in einem Beispiel im englischen Forum gezeigt, wie man ein Fenster-füllendes ImageGadget verwenden kann, um Rechtsklicks in einem Fenster zu erkennen und ein Popup-Menü zu öffnen.

Wie man das von hilpert angesprochene Problem jedoch ohne Umwege über andere Gadgets lösen kann, zeigt mein folgendes Beispiel. Es installiert für einen Kontextmenü-Klick (rechter Mausklick) einen EventHandler für das Fenster und für das ButtonGadget. Beim Aufruf des EventHandlers wird jeweils das Handle des Fensters und des ButtonGadgets übergeben, sodaß im EventHandler festgestellt werden kann, ob der Kontextmenü-Klick auf das Fenster erfolgte oder auf das Gadget. Nur beim Kontextmenü-Klick auf das Fenster wird dann im EventHandler eine Variable gesetzt, die dann in der Ereignisschleife überprüft wird und zur Anzeige des Popup-Menüs führt.

Code: Alles auswählen

EnableExplicit

#kEventClassControl = 'cntl'
#kEventClassWindow = 'wind'
#kEventControlContextualMenuClick = 12
#kEventWindowContextualMenuSelect = 78

Structure EventTypeSpec
  EventClass.L
  EventKind.L
EndStructure

Define EventHandlerUPP.L
Define RightMouseButtonClick.I
Define WindowEvent.I

Procedure EventHandler(*NextEventHandler, Event.L, Ref.L)
  Shared RightMouseButtonClick.I

  If Ref = WindowID(0)
    RightMouseButtonClick = #True
  EndIf

  If *NextEventHandler
    CallNextEventHandler_(*NextEventHandler, Event)
  EndIf
EndProcedure

Dim EventTypes.EventTypeSpec(1)

OpenWindow(0, 200, 200, 300, 200, "Popup-Menu Example")
ButtonGadget(0, 10, 90, 280, 20, "Right click doesn't open Popup Menu!")
CreatePopupMenu(0)
MenuItem(1, "Option 1")
MenuItem(2, "Option 2")
MenuItem(3, "Quit")

; ----- Install EventHandler for Window to detect right clicks

EventHandlerUPP = NewEventHandlerUPP_(@EventHandler())
EventTypes(0)\EventClass = #kEventClassWindow
EventTypes(0)\EventKind = #kEventWindowContextualMenuSelect
InstallEventHandler_(GetWindowEventTarget_(WindowID(0)), EventHandlerUPP, 1, @EventTypes(), WindowID(0), 0)

; ----- Install EventHandler for each Gadget to detect right clicks

EventTypes(0)\EventClass = #kEventClassControl
EventTypes(0)\EventKind = #kEventControlContextualMenuClick
InstallEventHandler_(GetControlEventTarget_(GadgetID(0)), EventHandlerUPP, 1, @EventTypes(), GadgetID(0), 0)

Repeat
  Select WaitWindowEvent(20)
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        Debug "Button clicked!"
      EndIf
    Case #PB_Event_Menu
      Select EventMenu()
        Case 1
          Debug "Menu: Option 1"
        Case 2
          Debug "Menu: Option 2"
        Case 3
          Break
      EndSelect
  EndSelect

  If RightMouseButtonClick
    DisplayPopupMenu(0, WindowID(0))
    RightMouseButtonClick = #False
  EndIf
ForEver