2016-03-24 5 views
-1

Ich habe eine Unterklasse von NSView nur für den Druck verwendet, und es macht einige ziemlich komplizierte Sachen während des Druckens, die einen Fortschrittsdialog erscheinen kann. Das Problem besteht darin, dass der Fortschrittsdialog nicht auf dem Bildschirm, sondern auf dem Ausdruck angezeigt wird.Kann ich während des Druckens ein Fenster anzeigen?

Ich versuchte Haltepunkte, die in ein Fenster mit [NSGraphicsContext saveGraphicsState] und [NSGraphicsContext restoreGraphicsState]; zeichnen könnte, und das hat nicht funktioniert.

Ich habe auch versucht

[self unlockFocus]; 
[self stuffThatMightDrawAWindow]; 
[self lockFocus]; 

und das hat nicht funktioniert. In der Tat fand ich, dass direkt nach der unlockFocus, [NSView focusView] immer noch auf meine Druckansicht zeigt, als ob die unlockFocus tat eigentlich nichts.

Ich vermute, ich sollte versuchen, meinen Code zu reorganisieren, so dass nur Zeichnung auf den Ausdruck in meiner Druckansicht drawRect: Methode passiert, aber ich bin neugierig, ob das die einzige Lösung ist.


Ich habe versucht, Refactoring alle Inhalte der Zubereitung in der rectForPage: Methode zu tun, der erste Ort, an dem ich die Seitenzahl kennen. Jetzt sieht der Ausdruck in Ordnung, aber wenn ich eine einfache modale NSAlert während rectForPage: laufen, ist die Warnung leer bis auf die Schaltfläche:

white alert

Antwort

2

Ich fand einen old (2001) post by Erik M. Buck sagen:

Während einer NSView Wird gedruckt, wird seine Verbindung zum Windows Server durch eine Verbindung zur Druckauftragsausgabe ersetzt. Manchmal muss das NSView während des Druckens kurz mit dem Windows Server kommunizieren; zum Beispiel, es müssen möglicherweise einige Daten nur auf dem Windows-Server gespeichert lesen, oder öffnen Sie eine Aufmerksamkeit Panel, um den Benutzer eines Problems zu alarmieren. In diesen Fällen kann vorübergehend den Anzeigekontext des NSApplication-Objekts austauschen, um Zugriff auf den Windows Server-Status der Anwendung und auf den Bildschirm wiederherzustellen. Wenn beendet ist, stellt das Ansichtsobjekt den Kontext der Druckoperation wieder her, um sein Bild zu generieren.

So wurde die Lösung

[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext: [NSApp context]]; 
[self stuffThatShowsDialogsInsteadOfPrinting]; 
[NSGraphicsContext restoreGraphicsState]; 

Es ist die zweite Zeile, mit [NSApp context], dass ich nie, ohne einen Hinweis gedacht.