TN030: 自訂列印和預覽列印
注意事項 |
---|
由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。 |
這張便箋說明自訂列印和預覽列印的程序,並說明中所使用的回呼常式的CView回呼常式和成員函式的 CPreviewView。
問題
MFC 提供完整的解決方案,大部分的列印和預覽列印的需要。 在大多數情況下,一些額外的程式碼是一定要有能夠列印和預覽] 檢視。 不過,如果要最佳化列印需要極大的心力,讓開發人員的方法,而且某些應用程式需要將特定的使用者介面項目新增至預覽列印模式。
有效率的列印
當 MFC 應用程式列印時使用的標準方法,則 Windows 會指示記憶體中的中繼檔的所有圖形裝置介面 (GDI) 輸出呼叫。 當EndPage是呼叫,Windows 會播放一次的每個實體的群組列印表機列印一頁所需的中繼檔。 在此呈現期間,GDI 常常會查詢中止程序,以判斷應該繼續。 通常中止程序可讓郵件處理,因此使用者可能會中止列印工作使用 [列印] 對話方塊。
不幸的是,這會降低列印程序。 如果您的應用程式中列印必須比使用標準技術來達成,您必須實作手動級區構成。
列印 [級區構成
若要以手動方式條紋,您必須重新實作列印迴圈,讓OnPrint多次呼叫每一頁 (每次頻)。 列印迴圈中實作 OnFilePrint viewprnt.cpp 中的函式。 在您CView-衍生的類別,您多載此函式,以便處理列印命令的訊息對應項目會呼叫您的列印功能。 複製 OnFilePrint 常式 」 及 「 變更列印迴圈來實作 [級區構成。 您也想要條紋矩形傳遞您印表機的功能,以便您可以最佳化的區段被列印的頁面為基礎的繪圖。
第二,您必須經常呼叫QueryAbort寬線進行繪製時。 否則,不會呼叫中止程序,使用者將無法取消列印工作。
具有使用者介面的預覽列印: 電子紙張
列印預覽中,基本上,嘗試將轉換成的印表機模擬的顯示。 根據預設,在主視窗的工作區用來顯示完整視窗中的一或兩頁。 使用者就可以拉近頁面才能看到它更詳細的區域。 提供額外的支援,使用者甚至可能會允許編輯文件處於預覽模式。
自訂 [預覽列印]
這個注意事項僅分別是修改預覽列印: 新增至預覽模式的 UI。 其他的修改也有可能,但這類的變更而超出本文的討論範圍。
若要新增至預覽模式的 UI
衍生檢視類別從 CPreviewView。
新增您想要的 UI 外觀的命令處理常式。
如果要新增至顯示的視覺外觀,會覆寫OnDraw ,並執行您的繪圖,在撥號後 CPreviewView::OnDraw。
OnFilePrintPreview
這是預覽列印命令處理常式。 它的預設實作是:
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize,
// delete State now
}
}
DoPrintPreview 的應用程式,主要窗格] 會隱藏。 控制列,例如 [狀態] 列中,可以保留在 [pState]->dwStates 成員 (這是位元遮罩,而且個別控制列的位元所定義的 AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR))。 [視窗] pState->nIDMainPane 是將自動隱藏,reshown 的視窗。 DoPrintPreview 接著會建立按鈕列用於標準的 「 預覽 」 使用者介面。 如果需要特殊的視窗處理,例如隱藏或顯示其他視窗之前, 應完成 [ DoPrintPreview 呼叫。
根據預設,當預覽列印完成時,它會傳回控制列它們的原始狀態,並為看得到,主要窗格。 如果需要特殊處理,它應該要覆寫中 **EndPrintPreview。**如果 DoPrintPreview 就會失敗,也會提供特殊處理。
DoPrintPreview 是以呼叫:
[預覽] 工具列的對話方塊樣板資源 ID。
變數的指標,來執行列印預覽列印的檢視。
[預覽] 檢視類別的執行階段類別。 這將會以動態方式建立在 DoPrintPreview 中。
CPrintPreviewState 指標。 附註的 CPrintPreviewState 結構 (或如果應用程式需要更多的狀態保留的衍生的結構) 必須不建立的框架上。 DoPrintPreview 非強制回應,直到呼叫 EndPrintPreview 時,這個結構必須存活下來。
注意事項 如果列印支援需要不同的檢視] 或 [檢視類別,應做為第二個參數傳遞給該物件的指標。
EndPrintPreview
這就稱為結束預覽列印模式。 通常會移到上一次顯示在預覽列印中的文件中頁面。 EndPrintPreview 應用程式的機會,若要這麼做。 [PInfo]->m_nCurPage成員是網頁上一次顯示 (最左端如果兩個頁面所顯示),而指標是提示,以做為位置在頁面上的使用者已感。 由於應用程式的檢視的結構是無法辨識的架構,您必須提供的程式碼,以移至選定的點。
您應該執行大部份的行動電話前 CView::EndPrintPreview。 這個呼叫都會反轉所造成的影響 DoPrintPreview ,並刪除 pView、 pDC 和 pInfo。
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
這必須設定列印格式] 功能表項目的對應。 在大多數情況下,不需要覆寫的實作。
網頁術語
另一個問題是頁碼編排方式和順序。 對於簡單的文書處理器型別應用程式,這是一個簡單的問題。 在大多數的預覽列印系統會假設每張列印的頁面對應到文件中每一頁。
嘗試提供通用的解決方案,有幾點需要考慮。 想像一下 CAD 系統。 使用者必須涵蓋了數個 e 大小紙張的繪圖。 E 大小上 (或較小的縮放) 繪圖機上,頁碼編排方式就是做為在最簡單的情況下。 但是在雷射印表機,列印的每張紙,16 A 大小頁面上並不會在預覽列印考慮哪些 「 頁面 」 呢?
簡介段落所述,如 [預覽列印] 有如印表機。 因此,使用者會看到什麼會有已選取的特定印表機用完。 它是由檢視中,以判斷哪張影像列印在每一頁。
頁面的說明字串,在CPrintInfo結構會提供一種向使用者顯示之頁面的頁碼,如果它可以表示為一個數字,每一頁 (如同在 「 第 1 頁 」 或 「 頁 1-2")。 這個字串由預設實作的 CPreviewView::OnDisplayPageNumber。 如果需要不同的顯示,其中一個可能會覆寫這個虛擬的函式,來提供,比方說,"Sheet1 區段 A B"。