Problem mit Events in NSWindows NSViews

  • Problem mit Events in NSWindows NSViews

    Hallo,




    ich habe gerade ein Problem mit Events, das sich sicherlich leicht beheben lässt. Ich habe ein NSWindow und einen dazu gehörigen NSView. Wenn ich die Methoden mouseDown, mouseUp und mouseDragged in der Implementation des Windows verwenden will, um Mouse Events zu erhalten, dann funktioniert das nur für Mouse Down Events. Die anderen Methoden bleiben stumm.




    Wenn ich nun dieselben Methoden in der Implementation des Views verwende, dann kann ich alle drei Mouse Events erhalten. Wenn ich dann aber die Koordinaten des Mouse Down Events (erhalten von der entsprechenden View-Methode) an eine Methode des Windows weiterleite, so erhalte ich keine Mouse Up und Mouse Dragged Events von den Methoden innerhalb der View-Implementation mehr. Das kann ich mir nicht erklären.




    Was mache ich hier falsch? Wie könnte ich zum Beispiel dafür sorgen, dass mir die Mouse-Methoden in der Windows-Implementation die Daten liefern?
  • Ups, da war ich gestern Abend doch etwas zu vorschnell. Es hat in einem einfachen Beispiel funktioniert, tut aber doch nicht in meinem Project. Bezieht sich "setAcceptsMouseMovedEvents" denn nicht speziell auf die Bewegung der Maus und nicht auf MouseUp und MouseDragged Events?
  • Ich habe das Problem nun etwas weiter eingekreist und folgendes festgestellt:




    es gibt wohl einen Zusammenhang zwischen den Mouse Events und der Methode "setContentView". Wenn ich "setContentView" bei der Initialisierung des Windows aufrufe und das View dadurch zum ContentView mache, dann werden die Mouse Events durch die Window-Methoden "mouseDown", "mouseUp" und "mouseDragged" eingelesen. Aber dann wird der Fensterinhalt durch die View-Methode "drawRect" nur einmal gezeichnet. Wiederholte Aufrufe von "drawRect" zeichnen keinen aktualisierten Fensterinhalt. Es ist, als ob überhaupt keine Zeichenroutinen mehr ablaufen würden.




    Wenn ich aber vor jeden "drawRect"-Aufruf den Aufruf "setContentView" voranstelle, dann zeichnet "drawRect" den jeweils aktuellen Fensterinhalt. Allerdings funktionieren nach diesem erneuten Aufruf von "setContentView" nur noch die MouseDown Events; "mouseUp" und "mouseDragged" lesen keine aktuellen Werte mehr ein.




    Ich verstehe erstens nicht, warum der einmal gewählte View nicht der ContentView bleibt, nachdem er zu diesem gemacht worden ist und warum man vor jedem Aufruf von "drawRect" den View offensichtlich erneut zum ContentView machen muss. denn ich habe an dem View ja nichts geändert, und warum ändert er sich dann?




    Dann verstehe ich den Zusammenhang zwischen den Mouse Events und "SetContentView" nicht. Weiß da jemand eine Antwort und kann mir sagen, was ich ändern muss?
  • RainerB schrieb:

    es gibt wohl einen Zusammenhang zwischen den Mouse Events und der Methode "setContentView". Wenn ich "setContentView" bei der Initialisierung des Windows aufrufe und das View dadurch zum ContentView mache, dann werden die Mouse Events durch die Window-Methoden "mouseDown", "mouseUp" und "mouseDragged" eingelesen. Aber dann wird der Fensterinhalt durch die View-Methode "drawRect" nur einmal gezeichnet.

    Hat sich denn am View etwas verändert, dass ein Neuzeichnen notwendig wäre?

    RainerB schrieb:

    Wiederholte Aufrufe von "drawRect" zeichnen keinen aktualisierten Fensterinhalt. Es ist, als ob überhaupt keine Zeichenroutinen mehr ablaufen würden.

    Du rufst drawRect: hoffentlich nicht selbst auf, oder?

    RainerB schrieb:

    Wenn ich aber vor jeden "drawRect"-Aufruf den Aufruf "setContentView" voranstelle, dann zeichnet "drawRect" den jeweils aktuellen Fensterinhalt. Allerdings funktionieren nach diesem erneuten Aufruf von "setContentView" nur noch die MouseDown Events; "mouseUp" und "mouseDragged" lesen keine aktuellen Werte mehr ein.

    Was machst Du da eigentlich und was willst Du überhaupt erreichen?

    RainerB schrieb:

    Ich verstehe erstens nicht, warum der einmal gewählte View nicht der ContentView bleibt, nachdem er zu diesem gemacht worden ist

    Der einmal gesetzte ContentView bleibt der ContentView, bis man ihn durch einen anderen ersetzt.

    RainerB schrieb:

    und warum man vor jedem Aufruf von "drawRect" den View offensichtlich erneut zum ContentView machen muss.

    Das muss man nicht. Man ruft drawRect: allerdings auch nicht selbst auf. Das macht das System von alleine.

    RainerB schrieb:

    Dann verstehe ich den Zusammenhang zwischen den Mouse Events und "SetContentView" nicht.

    Der einzige Zusammenhang der da besteht, ist die Responder Chain.

    RainerB schrieb:

    Weiß da jemand eine Antwort und kann mir sagen, was ich ändern muss?

    Ich glaube, Du musst Dich erst mal damit beschäftigen, wie das Grafiksystem von OS X überhaupt funktioniert.

    Michael