打印时可以显示窗口吗?

时间:2016-03-24 18:15:34

标签: macos cocoa printing nsview

我有一个NSView的子类仅用于打印,并且在打印时会执行一些相当复杂的操作,这可能会导致出现进度对话框。问题是进度对话框会进入打印输出而不是屏幕。

我尝试将可能绘制到[NSGraphicsContext saveGraphicsState][NSGraphicsContext restoreGraphicsState];的窗口的地方包围起来,但这并不起作用。

我也试过

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

那并没有奏效。事实上,我发现在unlockFocus之后,[NSView focusView]仍然指向我的打印视图,好像unlockFocus实际上并没有做任何事情。

我想我应该尝试重新组织我的代码,以便在我的打印视图的drawRect:方法中只绘制到打印输出,但我很好奇是否这样做唯一的解决方案。

我尝试重构以rectForPage:方法完成所有内容准备工作,这是我知道页码的第一个地方。现在打印输出看起来不错,但是如果我在NSAlert期间运行一个简单的模态rectForPage:,除了按钮之外警报是空白的:

white alert

1 个答案:

答案 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],如果没有提示,我将永远不会想到。