2016-03-24 2 views
-1

У меня есть подкласс NSView, который используется только для печати, и при печати он довольно сложный, что может привести к появлению диалогового окна прогресса. Проблема заключается в том, что диалог прогресса втягивается в распечатку, а не на экран.Могу ли я показать окно во время печати?

Я пробовал места для брекетинга, которые могли бы нарисовать окно с [NSGraphicsContext saveGraphicsState] и [NSGraphicsContext restoreGraphicsState];, и это не сработало.

Я также попытался

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

и это не сработало. На самом деле я обнаружил, что сразу после unlockFocus, [NSView focusView] все еще указывает на мой вид печати, как будто unlockFocus на самом деле ничего не сделал.

Я полагаю, что я должен попытаться реорганизовать свой код, чтобы в моем методе печати drawRect: произошел только рисование на распечатке, но мне любопытно, является ли это единственным решением.


Я попытался рефакторинга сделать все содержание препарата в методе rectForPage:, первое место, где я знаю номер страницы. Теперь распечатка выглядит хорошо, но если я бегу простой модальных NSAlert во rectForPage:, предупреждение пустым для кнопки, за исключением:

white alert

ответ

2

Я нашел old (2001) post by Erik M. Buck говоря:

Хотя NSView является печать, его соединение с Window Server заменяется соединением с выходом задания печати. Иногда NSView должен коротко обмениваться информацией с сервером Window во время печати; например, может потребоваться прочитать некоторые данные, хранящиеся только на Window Server, или открыть панель внимания , чтобы предупредить пользователя о проблеме. В этих случаях он может временно переключиться в контекст отображения объекта NSApplication, чтобы восстановить доступ к состоянию окна Window Server и к экрану. Когда завершено, объект вида восстанавливает контекст операции печати, чтобы продолжить формирование .

Таким образом, решение было

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

Это что вторая линия, с [NSApp context], что я никогда бы не подумал, без намека.