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

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

Beitrag von hilpert »

Das letzte Beispiel von Shardik funktioniert hervorragend,
auch wenn ich die Details nicht verstehe.
Daher habe ich das mal reduziert zur Demonstration fur den RightMouseButtonClick allein :

Code: Alles auswählen

;--------------------------------------------------------------
EnableExplicit

#kEventClassControl = 'cntl'
#kEventClassWindow = 'wind'
;#kEventControlContextualMenuClick = 12
#kEventWindowContextualMenuSelect = 78; 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, "MouseButtonClick-Example")

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

Repeat
  Select WaitWindowEvent(20)
    Case #PB_Event_CloseWindow : Break
  EndSelect
  
  If RightMouseButtonClick : MessageRequester("","RightClicked"):RightMouseButtonClick = #False:EndIf
  
ForEver
End
;----------------------------------------------------------------------
FRAGE an Shardik :
Wie müßte das obige (reduzierte) Beispiel
fur den LeftMouseButtonClick verändert werden.?
GRUSS von hilpert

__________________________________________________
Code-Tags hinzugefügt
30.05.2011
RSBasic
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag von Shardik »

Hallo hilpert,

Du hast zwar mein Beispiel vereinfacht, aber es leider damit auch seiner
wichtigsten Fähigkeit beraubt, nämlich einen Rechtsklick auf ein Fenster
von einem Rechtsklick auf ein Gadget zu unterscheiden, was Du in
Deinem Ursprungs-Posting übrigens ausdrücklich gefordert hattest:
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 ??
Ich hatte deshalb lange an der Lösung Deines Problems herumprobiert.
Ansonsten hatte ich im englischen Forum nämlich bereits eine "einfachere"
Lösung demonstriert gehabt, die zwar einen Klick auf die linke, mittlere
und rechte Maustaste in einem Fenster erkennt, aber nicht unterscheidet,
ob die Klicks auf eine freie Fensterfläche oder ein Gadget erfolgt sind:
http://www.purebasic.fr/english/viewtop ... 52&start=3

Aber keine Angst, ich habe mein "komplizierteres" Beispiel in diesem
Thread noch weiter ausgebaut, sodaß auch Klicks mit der linken Maustaste
erkannt werden: :wink:

Code: Alles auswählen

EnableExplicit

ImportC ""
  GetEventClass(Event)
EndImport

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

Structure EventTypeSpec
  EventClass.L
  EventKind.L
EndStructure

Define EventHandlerUPP.L
Define WindowEvent.L

Procedure EventHandler(*NextEventHandler, Event.L, Ref.L)
  Select GetEventClass(Event)
    Case #kEventClassWindow
      Select GetEventKind_(Event)
        Case #kEventWindowContextualMenuSelect
          If Ref = WindowID(0)
            Debug "Right click in Window"
          EndIf
        Case #kEventWindowHandleContentClick
          Debug "Left click in Window"
      EndSelect
    Case #kEventClassControl
      If GetEventKind_(Event) = #kEventControlContextualMenuClick
        Debug "Right click on Button"
      EndIf
  EndSelect

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

Dim EventTypes.EventTypeSpec(1)

OpenWindow(0, 200, 200, 300, 200, "MouseButtonClick-Example")
ButtonGadget(0, 100, 90, 100, 20, "Click me!")

; ----- Intercept right click into window

EventTypes(0)\EventClass = #kEventClassWindow
EventTypes(0)\EventKind = #kEventWindowContextualMenuSelect

; ----- Intercept left click into window

EventTypes(1)\EventClass = #kEventClassWindow
EventTypes(1)\EventKind = #kEventWindowHandleContentClick

; ----- Install EventHandler for Window

EventHandlerUPP = NewEventHandlerUPP_(@EventHandler())
InstallEventHandler_(GetWindowEventTarget_(WindowID(0)), EventHandlerUPP, 2, @EventTypes(), WindowID(0), 0)

; ----- Install EventHandler for each Gadget that has 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()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0
        Select EventType()
          Case #PB_EventType_LeftClick
            Debug "Left click on Button"
        EndSelect
      EndIf
  EndSelect
ForEver
hilpert
Beiträge: 14
Registriert: 01.12.2004 12:15

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

Beitrag von hilpert »

Hallo Shardik,
'... wichtigsten Fähigkeit beraubt, nämlich einen Rechtsklick auf ein Fenster
von einem Rechtsklick auf ein Gadget zu unterscheiden, was Du in
Deinem Ursprungs-Posting übrigens ausdrücklich gefordert hattest ...'

komplett richtig. ... habe das nur erstmal reduziert, um den
Vorgang rudimentär zu verstehen, und um die mögliche Veränderung
zum zusätzlichen MouseLeftClick zu verstehen.

Leider funktioniert Dein neues Beispiel bei mir überhaupt nicht mehr.
Grund ist offensichtlich der zusätzliche 'Einbau' von - IMPORTC "" _
welcher bei mir komplett ignoriert wird.

Dein erstes Beispiel und das sog. reduzierte Beispiel funktioniert
ja auch ohne den IMPORT. Da dachte ich mir, der 'MousLeftClick'
müsste auch ohne den IMPORT gehen. Deswegen auch erstmal das
reduzierte Beispiel.

Daher Frage :
Läßt sich Dein erstes Beispiel erweitern mit MouseLeftClick
auch ohne IMPORTC ?

Wenn nicht, benötige ich Nachhilfe bei IMPORTC "".
ie es handelt sich wohl um eine externe Library,
die nicht im MacOs PureBasic implementiert ist,
sondern von irgendwoher (?) zu downloaden
und anschließend zu installieren ist.
Daher: wo ist das zu finden und wie geht das.?
Aber eigentlich wollte ich auf IMPORTC lieber verzichten wenn möglich.
uff
Mein System ist : MiniMac mit PPC und MacOs 10.4.11 und PureBasic 4.51
Cheers, hilpert
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag von Shardik »

Hallo hilpert,

ich wußte nicht, daß Du mit einem PPC-Mac und MaxOS X 10.4 arbeitest.
Leider bin ich selbst noch ein absoluter Anfänger auf dem Mac und habe
meinen ersten Mac (ein 22'-iMac mit 3,6 GHz Intel Core i5-Prozessor und
MacOS X 10.6.7) erst im August letzten Jahres gekauft, weil ich zum ersten
Mal eine plattformunabhängige Anwendung für Windows, Linux und Mac
entwickeln mußte.

Ich habe leider keinerlei Möglichkeit auf einem PPC-Mac zu testen. Ich hatte
zwar bereits überlegt, mir über eBay einen alten PPC-Mac zu ersteigern,
aber das kann noch dauern, weil ich momentan noch in zu vielen anderen
Projekten involviert bin...

Anscheinend hat die Unterstützung der PPC-Version von PB auch eine sehr
niedrige Priorität, wie eine Reihe von unbeantworteten Fehler-Postings im
englischen "Bugs - Mac OSX"-Unterforum belegen.

Der ImportC...EndImport-Block importiert übrigens die vom MacOS
bereitgestellte API-Funktion (API = Application Programming Interface)
GetEventClass(), sodaß sie in meinem Programm-Beispiel verwendet werden
kann. Normalerweise sind solche API-Funktionen mit einem angehängten
Unterstrich in PB direkt aufrufbar, aber die Funktion GetEventClass() ist
augenscheinlich vergessen worden, sodaß sie mit ImportC vor der
Verwendung in PB bekannt gemacht werden muß.

freak hat in diesem Posting im englischen Forum erläutert, wie ImportC auf
dem Mac in PB eingesetzt wird:
http://www.purebasic.fr/english/viewtop ... 83&start=1

Anscheinend funktioniert ImportC "" auf Deinem PPC-Mac mit MacOS X 10.4
im Gegensatz zu meinem Intel-iMac mit MacOS X 10.6 nicht. Welche
Fehlermeldung erhälst Du eigentlich? Versuche in einem ersten Schritt
einfach einmal den Pfad zum Carbon-Framework anzugeben (den Du
vielleicht noch an Deine Verzeichnisstruktur anpassen mußt):

Code: Alles auswählen

ImportC "/System/Library/Frameworks/Carbon.framework/Carbon"
hilpert
Beiträge: 14
Registriert: 01.12.2004 12:15

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

Beitrag von hilpert »

Hallo Shardik,
Deine neueste ProgrammVariante für die Erkennung von MausClicks
funktioniert bei mir doch einwandfrei.!
Ich hatte schlichtweg den Debugger noch nicht eingeschaltet,
da ich noch auf den MessageRequester wartete.
Daher 'Very Sorry' daß ich Dir da jetzt extra Mühe gemacht habe.
Mit diesem ProgrammTeil von Dir ist nun sicherlich ein Feature erschlossen,
was viele MacOS-User in PB bisher vermißt haben.!
Vielen Dank.
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag von Shardik »

Hallo hilpert,

es freut mich, daß mein erweitertes Beispiel bei Dir funktioniert und
sich meine Mühe gelohnt hat. Es ist auch schön zu wissen, daß es
auf Deinem PPC-Mac unter MacOS X 10.4 läuft. Vielleicht melde ich
mich ja irgendwann einmal bei Dir und werde Dich dann darum bitten,
meine neue Anwendung auf Deinem Mac zu testen um sicherzustellen,
daß sie auch auf einem PowerPC-Mac läuft (wenn ich bis dahin nicht
selbst einen PPC-Mac gefunden habe)... :wink:
Antworten