多頁文件

本文說明 Windows 的列印通訊協定,並說明如何列印文件包含多個網頁。本文件涵蓋下列主題:

  • 列印通訊協定

  • 覆寫檢視類別函式

  • 分頁

  • 印表機網頁 vs。文件頁面

  • 列印階段分頁

列印通訊協定

若要列印多頁文件,以下列方式進行互動的架構和檢視。第一次的架構會顯示列印 對話方塊中,建立裝置內容的印表機,然後呼叫 StartDoc 成員函式的 CDC 物件。然後,每一頁的文件中,架構會呼叫的開始頁面成員函式的CDC物件,會指示 view 物件,若要列印的頁面上和呼叫 EndPage 成員函式。如果前開始特定的頁面,必須先改變印表機模式,則檢視會呼叫 ResetDC,哪些更新 DEVMODE 結構包含新的印表機模式資訊。已列印整份文件,架構會呼叫行為成員函式。

覆寫檢視類別函式

CView 類別會定義在列印時,架構會呼叫數個成員函式。藉由覆寫檢視類別中的這些函式,您必須提供架構的列印邏輯和檢視類別中的列印邏輯之間的連線。下表列出這些成員函式。

列印 CView 的可覆寫函式

名稱

覆寫的原因

OnPreparePrinting

若要將值插入 [列印] 對話方塊的尤其是文件長度

OnBeginPrinting

若要配置的字型或其他的 GDI 資源

OnPrepareDC

若要調整指定的頁面,裝置內容的屬性,或要列印階段分頁

OnPrint

若要列印特定的頁面

OnEndPrinting

若要解除配置 GDI 資源

您可以將處理列印相關的其他函式,但這些函式是驅動列印處理程序。

下圖說明列印程序所需的步驟,並示範加入何處,每個CView的列印的成員函式會呼叫。這份文件的其餘部分將說明大部分的詳細步驟。列印程序的其他組件所述的文件配置 GDI 資源

列印迴圈

列印迴圈程序

分頁

架構會儲存在列印工作的相關資訊的 CPrintInfo 結構。幾個值在CPrintInfo條列式重新編頁。 這些值是可存取,如下列表格所示。

儲存在 CPrintInfo 中的頁碼資訊

成員變數或

函式名稱

參考頁碼

GetMinPage/SetMinPage

文件的第一頁

GetMaxPage/SetMaxPage

文件的最後一頁

GetFromPage

要列印的第一頁

GetToPage

要列印的最後一頁

m_nCurPage

目前列印的頁面

頁碼開始於 1,也就是第一頁編號是 1,而不是 0。如需有關這些及其他成員的 CPrintInfo,請參閱 MFC 參考手冊 》

在列印程序的開頭,架構會呼叫這個檢視表的 OnPreparePrinting 成員函式,傳遞變數的指標, CPrintInfo結構。應用程式精靈提供實作的OnPreparePrinting ,以呼叫 DoPreparePrinting,另一個成員函式的CViewDoPreparePrinting是一個函數,以顯示 [列印] 對話方塊,並建立印表機裝置內容。

此時應用程式並不知道文件中有多少頁數。它會使用預設值 1 和 0xFFFF 作為文件的第一個和最後一個頁面的編號。如果您知道您的文件中有多少頁時,會覆寫OnPreparePrinting ,並呼叫 SetMaxPageCPrintInfo結構在傳送前DoPreparePrinting。這可讓您指定文件的長度。

DoPreparePrinting接著會顯示 [列印] 對話方塊。當它傳回時, CPrintInfo結構包含使用者指定的值。如果使用者想要列印只選取的範圍的頁數,他或她可以會指定開始和結束的 [列印] 對話方塊中的頁碼。架構會擷取這些值GetFromPageGetToPage函式的 CPrintInfo。如果使用者並未指定的頁面範圍,架構會呼叫GetMinPageGetMaxPage ,並使用 [列印整份文件所傳回的值。

每一頁的列印文件中,架構會呼叫兩個成員函式在檢視類別中, OnPrepareDCOnPrint,並將每個函式傳遞兩個參數: 變數的指標, CDC 物件和變數的指標, CPrintInfo結構。每次的架構呼叫OnPrepareDCOnPrint,它會傳遞不同的值,在m_nCurPage成員的CPrintInfo結構。如此一來架構會告訴檢視應列印哪些頁面。

OnPrepareDC 成員函式也適用於螢幕顯示。進行繪圖之前,它會調整裝置內容。OnPrepareDC在印刷中,可具有類似角色有幾點的差異,但: 第一, CDC物件所表示的印表機裝置內容,而非螢幕裝置內容,以及第二個, CPrintInfo物件做為第二個參數傳遞。(這個參數是 NULLOnPrepareDC會在螢幕上的呼叫。)覆寫OnPrepareDC調整裝置內容要列印的頁面為基礎。比方說,您可以移動檢視區原點和裁剪區域以確保適當的法律文件取得列印。

OnPrint 成員函式會執行實際的頁面列印。發行項如何預設列印已完成 示範架構如何呼叫 OnDraw 與執行列印的印表機裝置內容。自訂函數,架構呼叫OnPrintCPrintInfo結構和裝置內容,以及OnPrint會傳遞裝置內容,以便OnDraw。覆寫OnPrint進行任何轉譯應該只在列印,而不是用於螢幕顯示。例如,若要列印頁首或頁尾 (請參閱文件頁首和頁尾如需詳細資訊)。然後呼叫OnDraw的覆寫從OnPrint進行呈現的通用的同時螢幕顯示和列印。

事實上, OnDraw不會呈現,如兩個螢幕顯示和列印是指您的應用程式時所見即所得: 「 您所看到的是所得 」。然而,假設您不撰寫 WYSIWYG 的應用程式。比方說,請考慮文字編輯器,用於列印的粗體字型,但會顯示指出粗體的文字在螢幕上的控制碼。在這種情況下,您可以使用OnDraw嚴格用於螢幕顯示。當您覆寫OnPrint,以取代呼叫OnDraw與個別的繪圖函式的呼叫。該函式會繪製文件的紙張,使用屬性,您不會顯示在螢幕上顯示的方式。

印表機網頁 vs。文件頁面

當提及頁數時,有時候是需區分頁面的印表機的概念,以及網頁的文件的概念。從印表機的視點,頁面會是一張紙。不過,一張紙並不必然等於文件中的頁面。比方說,如果您要列印一份,工作表的位置會摺疊,一張紙可能包含的文件並排比較於第一個和最後一頁。同樣地,如果您正在列印試算表,文件並不會包含的頁數根本。相反地,一張紙可能包含 1 到 20,資料行 6 到第 10 列。

中的所有頁面都編號 CPrintInfo 結構,請參閱印表機頁數。架構呼叫OnPrepareDCOnPrint也會通過印表機的紙張的每一個工作表一次。當您覆寫 OnPreparePrinting 函式來指定文件的長度時,您必須使用印表機頁數。如果沒有一對一的對應 (也就是印表機頁面等於文件頁面),那麼就很容易。相反地,文件頁面和印表機頁面並不直接對應,如果您必須轉譯他們。例如,考慮列印試算表。在覆寫OnPreparePrinting,您必須計算列印整個試算表,然後使用該值呼叫時就必須進行多少張紙SetMaxPage成員函式的CPrintInfo。同樣地,在覆寫OnPrepareDC,則必須轉譯m_nCurPage插入資料列和資料行,將會出現在該特定的工作表上,然後據此調整檢視區原點的範圍。

列印階段分頁

在某些情況下,您的檢視類別可能不知道事先多長的文件是等到實質列印。比方說,假設您的應用程式不是 WYSIWYG,所以在螢幕上的文件的長度並不會對應到其列印時的長度。

這會造成問題,當您覆寫 OnPreparePrinting 的檢視類別: 您不能傳遞值到SetMaxPage函式的 CPrintInfo 結構,因為您不知道文件的長度。如果使用者並未指定頁碼,在使用 [列印] 對話方塊,架構會不知何時停止列印迴圈。若要判斷何時停止列印迴圈的唯一方法是列印文件,並看它何時停止。檢視類別必須檢查文件結尾時,它會被列印出來,並在到達結尾時,然後通知架構。

檢視類別中的架構必須藉助 OnPrepareDC 函式來判斷它何時停止。在每次呼叫後OnPrepareDC,架構會進行檢查的成員, CPrintInfo結構稱為m_bContinuePrinting。預設值是 ,則為 TRUE。只要保持這樣,架構會持續列印迴圈。如果設定為 [ ,則為 FALSE,架構停駐點。若要執行列印階段分頁,覆寫OnPrepareDC來檢查文件的結尾是否已經到期,並設定m_bContinuePrinting,則為 FALSE 何時才。

預設實作的OnPrepareDC設定m_bContinuePrinting,則為 FALSE 如果目前的網頁大於 1。這表示如果沒有指定文件的長度,架構假定文件長度為一頁。這一種結果是您必須小心,如果您呼叫的基底類別版本OnPrepareDC。請不要假設, m_bContinuePrinting將會是 ,則為 TRUE 之後呼叫基底類別版本。

w7wzay73.collapse_all(zh-tw,VS.110).gif您還想知道關於哪些方面的詳細資訊?

請參閱

參考

列印

CView 類別

CDC 類別