我有一个NSView
的子类仅用于打印,并且在打印时会执行一些相当复杂的操作,这可能会导致出现进度对话框。问题是进度对话框会进入打印输出而不是屏幕。
我尝试将可能绘制到[NSGraphicsContext saveGraphicsState]
和[NSGraphicsContext restoreGraphicsState];
的窗口的地方包围起来,但这并不起作用。
我也试过
[self unlockFocus];
[self stuffThatMightDrawAWindow];
[self lockFocus];
那并没有奏效。事实上,我发现在unlockFocus
之后,[NSView focusView]
仍然指向我的打印视图,好像unlockFocus
实际上并没有做任何事情。
我想我应该尝试重新组织我的代码,以便在我的打印视图的drawRect:
方法中只绘制到打印输出,但我很好奇是否这样做唯一的解决方案。
我尝试重构以rectForPage:
方法完成所有内容准备工作,这是我知道页码的第一个地方。现在打印输出看起来不错,但是如果我在NSAlert
期间运行一个简单的模态rectForPage:
,除了按钮之外警报是空白的:
答案 0 :(得分:2)
我发现old (2001) post by Erik M. Buck说:
在打印NSView时,将替换其与Window Server的连接 通过连接到打印作业输出。有时NSView需要 打印时与Window Server短暂通信;例如,它 可能需要读取仅存储在Window Server上的一些数据,或者打开一个 注意面板提醒用户一个问题。在这些情况下,它可以 暂时交换NSApplication对象的显示上下文以进行恢复 访问应用程序的Window Server状态和屏幕。什么时候 完成后,视图对象恢复打印操作的上下文以继续 产生它的形象。
所以,解决方案是
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: [NSApp context]];
[self stuffThatShowsDialogsInsteadOfPrinting];
[NSGraphicsContext restoreGraphicsState];
这是第二行[NSApp context]
,如果没有提示,我将永远不会想到。