Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

MAC OSX spezifisches Forum
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
hilpert
Beiträge: 14
Registriert: 01.12.2004 12:15

Alternative von #WM_RButtonDown unter MacOs 3.11 PB4.5

Beitrag 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
hilpert
Beiträge: 14
Registriert: 01.12.2004 12:15

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

Beitrag von hilpert »

Oups - ich meinte naturlich unter MacOs 10.4.11
Hilpert
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
hilpert
Beiträge: 14
Registriert: 01.12.2004 12:15

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

Beitrag 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
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

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

Beitrag 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...
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

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

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

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

Beitrag 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
babelfish
Beiträge: 58
Registriert: 08.07.2009 10:53

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

Beitrag 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*)
Hauptsächlich Purebasic für OSX
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

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

Beitrag 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
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

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

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