用MFC編製Windows列印程式
文檔列印是許多Windows程式所必需的,在DOS下進行圖形方面的列印是件比較麻煩的事,幸好Windows提供了統一介面,將程式員與具體的硬體系統隔離開來。同時Visual C++ MFC(微軟基礎類庫)則將Windows的API函數以類的形式封裝了很多細節,使得許多煩瑣的工作變得輕鬆起來。
一般來說,用Visual C++編製需要列印的程式時,在用AppWizard產生工程檔案時就加入列印和預覽列印選項(該選項在AppWizard的第四步)。若用手工加入,則稍微麻煩些。
MFC對於列印的支援是在視類CView中實現的,該類中有如下幾個成員函數是與列印或預覽列印有關的:
BOOL OnPreparePrinting(CPrintInfopInfo)
void OnBeginPrinting(CDCpDC, CPrintInfopInfo)
void OnPrepareDC(CDCpDC, CPrintInfopInfo)
void OnPrint(CDCpDC, CPrintInfopInfo)
void OnEndPrinting(CDCpDC, CPrintInfopInfo)
其中,pDC是列印或顯示的裝置場指標,pInfo是列印過程資訊指標。pInfo包含許多有用的資訊,如列印的總頁數、當前列印頁的頁碼、是列印還是預覽列印、是否繼續列印等,具體參數內容和意義可以參考MFC線上手冊。
以上幾個函數都是虛函數,可以重載。若在用AppWizard產生工程檔案時選擇了列印和預覽列印選項,則函數OnPreparePrinting、OnBeginPrinting、OnEndPrinting自動地被AppWizard插入到你的視類中加以重載。另外兩個函數則可以手工加入,如果使用的是Visual C++ 4.0以上版本,可以通過ClassWizard加入到視類中。
這幾個函數在使用者選擇列印命令時由應用程式框架自動調用,使用者程式不用顯式調用。下面講述這幾個函數在列印過程中的調用順序及其意義。
1.OnPreparePrinting
OnPreparePrinting函數最先被調用,用來初始化印表機等。比如,若沒有安裝印表機,則該函數將提示使用者安裝印表機。使用者程式可以向其中加入別的初始化代碼,比如,計算列印你的文檔所需要的總頁數,然後調用視類中的印表機初始化函數BOOL DoPreparePrinting(CPrintInfopInfo)即可。而用AppWizard產生的程式碼中,OnPreparePrinting函數將只是調用函數DoPreparePrinting,並傳遞參數。
2.OnBeingPrinting
OnBeingPrinting函數是開始列印文檔前調用的函數,使用者可以在其中加入另一些對於列印過程的初始化代碼,比如分配列印過程中將要使用的“筆”(CPen)、“刷子”(CBrush)等,預設的代碼中該函數將直接返回。
3.OnEndPrinting
OnEndPrinting函數是與OnBeginPrinting函數相對應的函數,它在列印完成後由應用程式框架調用,用於釋放在OnBeginPrinting中分配的“對象”,如“筆”、“刷子”等,其預設的代碼中該函數將直接返回。
4.OnPrepareDC
OnPrepareDC函數用於在列印前準備列印裝置場,如視窗大小、原點,視圖大小、原點等。同時該函數在視類顯示文檔內容時也被調用,預設的代碼中該函數調用基類中的OnPrepareDC函數。
5.OnPrint
OnPrint函數則是具體的列印過程,它利用前面準備好的裝置場進行列印。
這幾個函數中,OnPreparePrinting、OnBeginPrinting、OnEndPrinting函數在一次列印過程中將只被調用一次,不管這一次列印內容有多少頁,而OnPrepareDC、OnPrint函數則每列印一頁都將被調用一次,這種調用次序對於列印是很有用的。