2016-03-24 21 views
-1

我有一個NSView的子類,僅用於打印,它在打印時會執行一些相當複雜的操作,這可能會導致出現進度對話框。問題在於進度對話框繪製在打印輸出中而不是屏幕上。打印時可以顯示一個窗口嗎?

我嘗試了使用[NSGraphicsContext saveGraphicsState][NSGraphicsContext restoreGraphicsState];可能畫到窗口的托架位置,但這並不起作用。

我也試過

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

,並沒有奏效。事實上,我發現在unlockFocus之後,[NSView focusView]仍然指向我的打印視圖,就好像unlockFocus實際上沒有做任何事情。

我想我應該嘗試重新組織我的代碼,以便只有繪圖到打印輸出發生在我的打印視圖的drawRect:方法中,但我很好奇這是否是唯一的解決方案。


我試圖重構做的rectForPage:方法中的所有內容準備,在那裏我知道了頁碼的首位。現在,打印輸出看起來不錯,但如果我在rectForPage:運行一個簡單的模式NSAlert,警報是除了按鈕空白:

white alert

回答

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],那我可能永遠都沒有了一絲想到的。

相關問題