共用方式為


多頁文件

本文說明 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 類別