【正文】
111 “ 打印 ” 時 調(diào)用 “打印”與“顯示”均調(diào)用 “顯示”時調(diào)用 WM _ CO MMA N D (I D _ F I L E _ PRIN T ) W M_ P A IN T CV i ew : : O n Pri n t () CV i ew : : O n P a i n t () CV i ew : : O n D ra w () Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 112 默認(rèn)的函數(shù) Cview::OnPrint( )中只是調(diào)用成員函數(shù)OnDraw( ), 而沒有進(jìn)行其他操作 。 在以前的程序中 , 并不考慮打印問題 , 因此我們只需考慮在 OnDraw()中如何完成屏幕輸出工作 。 但現(xiàn)在在 OnDraw()中添加代碼時 ,就必須小心這有可能是在進(jìn)行打印 , 并不僅向一個窗口輸出 。 如果這兩個函數(shù)在程序中不能統(tǒng)一 , 就必須分開考慮 。分開考慮時有兩種方法: (1) 分別在 OnPaint()和 OnPrint()這兩個函數(shù)中完成屏幕輸出和打印輸出工作 , 而不必依賴于 OnDraw()函數(shù) 。 (2) 在 OnDraw()函數(shù)中 , 調(diào)用 pDCIsPrinting()或設(shè)置變量來識別目前進(jìn)行的輸出工作并區(qū)別對待 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 113 【 例 】 編寫一個單文檔應(yīng)用程序 MyPrint, 實現(xiàn)簡單的打印功能 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 114 應(yīng)用程序的 【 File】 菜單條中自動添加 【 打印 】 、【 打印預(yù)覽 】 和 【 打印設(shè)置 】 3個菜單項 。 應(yīng)用程序基本打印功能的實現(xiàn)主要是由消息映射宏和消息處理函數(shù)完成的 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 115 (1) 在應(yīng)用程序視圖類 CMyPrintView的消息映射宏中包含了以下打印和打印預(yù)覽命令的消息映射代碼: BEGIN_MESSAGE_MAP(CMyPrintView, CScrollView) …… // Standard printing mands ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) END_MESSAGE_MAP() Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 116 (2)在 CMyPrintApp類的消息映射宏中包含了打印設(shè)置的以下消息映射代碼: BEGIN_MESSAGE_MAP(CMyPrintApp, CWinApp) …… // Standard file based document mands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup mand ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 117 (3) 在 3個函數(shù): BOOL CMyPrintView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo)。 } void CMyPrintView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyPrintView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 118 CPrintInfo類 CPrintInfo類保存了打印和打印預(yù)覽的相關(guān)信息 , 當(dāng)用戶單擊 【 File】 菜單的 【 打印 】 或 【 打印預(yù)覽 】 命令時 , 系統(tǒng)自動創(chuàng)建一個 CPrintInfo類對象 , 用于保存用戶打印設(shè)置的信息 。 當(dāng)打印操作結(jié)束時 , 系統(tǒng)自動刪除 CPrintInfo類對象 。 在打印過程中 , CPrintInfo類在框架窗口和 CView類之間起著消息傳遞的作用 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 119 打印過程 一個打印作業(yè)由以下幾步構(gòu)成: (1)如果執(zhí)行打印預(yù)覽命令 , 框架窗口將調(diào)用CView::OnPreparePrinting()函數(shù) , 創(chuàng)建與當(dāng)前默認(rèn)打印機(jī)相關(guān)的設(shè)備描述對象 , 對 CPrintInfo類中的一些成員變量賦值或調(diào)用類成員函數(shù)來控制打印的方式 ,調(diào)用 DoPreparePrinting()函數(shù) 。 如果執(zhí)行打印命令 , DoPreparePrinting()函數(shù)將顯示打印對話框 。 在對話框中 , 用戶可 以設(shè)置打印范圍 , 選擇打印機(jī) 、 打印份數(shù) 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 120 (2)調(diào)用 CView::OnBeginPrinting()函數(shù)分配打印過程所需要的系統(tǒng)資源 。 (3)調(diào)用 CDC::StartDoc()啟動主打印循環(huán) 。 (4)打印新頁時 , 框架窗口首先調(diào)用 CView::OnPrepareDC(),在打印之前根據(jù)當(dāng)前打印機(jī)的設(shè)備描述表進(jìn)行調(diào)整 。 如果事先不知道需要打印多少頁 , 則被重載的OnPrepareDC()函數(shù)可以檢測文檔的結(jié)束 。 如果文檔結(jié)束, 將 CPrintInfo::m_bContinuePrinting值設(shè)置為 FALSE, 跳到 (6);否則 , 設(shè)置 CPrintInfo::m_bContinuePrinting的值為 TRUE, 繼續(xù)進(jìn)行打印 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 121 (5) 調(diào)用 CDC::StartPage()、 CView::OnPrint()和CDC::EndPage()進(jìn)行打印。在默認(rèn)情況下, OnPrint()函數(shù)首先調(diào)用 OnPrepareDC()函數(shù)對坐標(biāo)進(jìn)行變換,然后調(diào)用 OnDraw()函數(shù)往打印機(jī)里輸出數(shù)據(jù)。 (6) 當(dāng) m_bContinuePrinting為 FALSE時,打印結(jié)束。調(diào)用 CDC::EndDoc()函數(shù)釋放在 打印過程中占用的各種資源。 (7) 調(diào)用 OnEndPrinting()函數(shù),結(jié)束打印。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 122 m _ b Co n t i n u ePri n t i n g : F A L SE m _ b Co n t i n u e Pri n t i n g : T RU E CV i ew : : O n Pr e p are Pr i n t i n g ( ) CV i ew : : O n B e g i n Pr i n t i n g ( ) CD C: : S t art D o c ( ) CV i ew : : O n Pr e p areD C ( ) CD C: : S t art Pag e ( ) CV i ew : : O n Pri n t ( ) CD C: : E n d Pa g e ( ) CD C: : E n d D o c ( ) CV i ew : : O n E n d Pr i n t i n g ( ) Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 123 打印預(yù)覽 打印預(yù)覽命令的執(zhí)行可以分成以下幾個步驟: ?主框架窗口執(zhí)行 OnFilePreparePrint()函數(shù) 。 在OnFilePreparePrint()函數(shù)中 , 執(zhí)行 OnPreparePrinting(CPrintlnfo*pInfo)函數(shù) , 檢測m_bPreview變量是否為 TRUE。 如果是 , 則對CPrintInfo類中的一些成員變量賦值或調(diào)用類成員函數(shù)來控制打印預(yù)覽的方式 。 ?調(diào)用 CView::DoPreparePrinting()函數(shù) , 顯示打印預(yù)覽界面 。 ?調(diào)用 OnDraw()函數(shù)按照打印機(jī)的設(shè)備描述表往屏幕輸出數(shù)據(jù) , 利用屏幕來模擬顯 示打印結(jié)果 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 124 設(shè)置打印坐標(biāo)系 Windows映射模式 Windows映射模式就是 Windows下的坐標(biāo)方式。在 Windows操作系統(tǒng)中,存在兩種類型的坐標(biāo):設(shè)備坐標(biāo)和邏輯坐標(biāo)。當(dāng)向設(shè)備輸出圖形時,Windows先映射當(dāng)前邏輯坐標(biāo)到物理坐標(biāo) (例如打印機(jī) ),然后顯示圖形輸出。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 125 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 126 映射模式的設(shè)置 在 MFC應(yīng)用程序中 , 通過調(diào)用 CDC類的SetMapMode()函數(shù)設(shè)置映射方式 。 如在視圖類的 OnDraw()函數(shù)中 , 可以通過以下代碼設(shè)置映射方式: pDC SetMapMode(n)。 其中 , n為上表中列出的映射方式 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 127 【例 】完善例 MyPrint,使打印輸出的圖形與顯示器顯示的圖形大小基本一樣。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 128 多頁打印 默認(rèn)打印存在的不足 【 例 】 完善例 MyPrint,程序運(yùn)行后,屏幕上能顯示 50個矩形。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 129 實現(xiàn)多頁打印功能 如果要使程序支持多頁打印功能 , 首先在打印之前設(shè)置要打印的頁數(shù) , 然后設(shè)置每一頁視圖原點(diǎn)的打印坐標(biāo) 。 1. 設(shè)置要打印的頁數(shù) 一般在 OnBeginPrinting()函數(shù)中設(shè)置要打印的頁數(shù) , 通過 CPrintInfo類的 SetMaxPage()和 SetMinPage()函數(shù)實現(xiàn) 。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 130 【 例 】 完善例 MyPrint,設(shè)置要打印的頁數(shù) Visual C++程序設(shè)計與應(yīng)用教程 2022/3/13 第 5章 對話框 131 2.設(shè)置正確的視圖原點(diǎn) 為了正確打印每一頁,需要設(shè)置每頁打印的內(nèi)容對應(yīng)于坐標(biāo)的那一部分區(qū)域。第一頁視圖原點(diǎn)的打印坐標(biāo)為 0,第二頁視圖原點(diǎn)的打印坐標(biāo)下移一個頁的高度,依此類推。 可以在 OnPrepareDC()函數(shù)中通過調(diào)用 CDC類成員函數(shù) SetViewPortOrg( )設(shè)置當(dāng)前頁的視圖原點(diǎn)坐標(biāo)。由于這些設(shè)置在 OnPrint()和 OnDraw()都起作用,既影響打印又影響顯示器顯示,因此必須調(diào)用 CDC類的成員函數(shù) IsPrinting()來判斷當(dāng)前狀態(tài)是打印輸出還是顯示器顯示。 Visual C++程序設(shè)計與應(yīng)用教程 2022/3