版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、利用MFC文檔視圖框架編寫打印程序 2006-03-08 15:55作者:戎亞新出處:vckbase責任編輯:方舟本文首先介紹了利用MFC提供的文檔視圖框架來實現(xiàn)一個打印程序,實現(xiàn)打印預(yù)覽,在此基礎(chǔ)上,同時通過對MFC源代碼的深入探討,提出了利用該方法在對話框上用MFC實現(xiàn)打印功能,結(jié)果表明,利用MFC實現(xiàn)打印不僅方便,而且功能很強大,能夠根據(jù)不同的需求很方便的打印出所需要的格式。本文還實現(xiàn)了一個在對話框中利用MFC實現(xiàn)打印功能的一個框架結(jié)構(gòu),對于使用者只要使用該結(jié)構(gòu)就可以按照自己的要求打印任何內(nèi)容。 關(guān)鍵詞:Visual C+ ,MFC,對話框, 打印 ,打印預(yù)覽引言打印程序的編寫在wind
2、ows程序設(shè)計中非常有用,針對不同的用戶需要,通常用sdk方式實現(xiàn)打印代碼量比較大,而且要對打印流程的底層有非常清楚的了解,需要一個程序員有非常深入的打印方面的知識,利用MFC提供的文檔視圖結(jié)構(gòu),不但可以實現(xiàn)一些常用的標準界面元素,把數(shù)據(jù)的處理的界面的處理分離出來,而且其提供的打印功能更是方便快捷,功能強大。打印程序的編寫本質(zhì)是是一種GDI繪圖,只是繪圖的對象是在打印機的設(shè)備描述表,如果對于屏幕的GDI繪圖比較熟悉的讀者,相信掌握打印程序的編寫應(yīng)該比較容易。1、文檔視圖結(jié)構(gòu)的程序的打印程序的編寫通常情況下,一個結(jié)構(gòu)組織的比較好的MFC程序是基于文檔視圖結(jié)構(gòu)的,這一框架結(jié)構(gòu)給我們提供了很多功能,
3、比如菜單,注冊表的關(guān)聯(lián),文件類型的注冊,打印功能,只要我們善于發(fā)掘,這些都可以為我們所用,但我們現(xiàn)在只關(guān)心如何使用MFC提供的結(jié)構(gòu)來實現(xiàn)打印功能。在編寫打印程序之前,有必要先介紹一下MFC的框架結(jié)構(gòu),其中的文檔視圖結(jié)構(gòu)又是這個框架的重點,我們通過分析MFC實現(xiàn)的視圖類的原代碼就可以看到一個打印程序的執(zhí)行流程。讀者也可以看侯俊杰的深入淺出MFC,上面有關(guān)于MFC打印的詳細流程解釋,下面是MFC的打印的函數(shù)的實現(xiàn),該函數(shù)名為OnFilePrint它不是一個虛函數(shù),而是響應(yīng)缺省的COMMAND消息的處理函數(shù),因為MFC提供了向?qū)傻牟藛魏凸ぞ邫?,關(guān)于打印的命令I(lǐng)D為ID_FILE_PRINT ,而
4、在視圖類的MessageMap里有這樣一項,ON_COMMAND (ID_FILE_PRINT, CView:OnFilePrint),因此實際使用的過程中可以不用原來的ID, 而使用自己的ID如ID_MYPRINT,再在MessageMap里加入ON_COMMAND (ID_MYPRINT, CView:OnFilePrint)即可完成原來一樣的功能。ViewPrnt.cpp中有CView的OnFilePrint的函數(shù)的具體實現(xiàn),ViewPrnt.cpp的位置讀者自己用windows查找就能找到,這是MFC的源代碼,本文把其中的主要代碼列出放在下面,直接看下面的分析: void CView:
5、OnFilePrint()/ get default print infoif (OnPreparePrinting(&printInfo)if (dlg.DoModal() != IDOK)return;OnBeginPrinting(&dcPrint, &printInfo);OnPrepareDC(&dcPrint, &printInfo);OnPrint(&dcPrint, &printInfo);OnEndPrinting(&dcPrint, &printInfo); / clean up after print
6、ing 其中加粗的代碼行為可以重載的虛函數(shù),根據(jù)不同的用戶,其內(nèi)容會不同。對于 OnPreparePrinting() 函數(shù)的具體內(nèi)容必須有 return DoPreparePrinting(pInfo);這是在一個打印過程中最先調(diào)用的。當然也可以包含一些其它的打印初始化操作。我們最主要的是要重載三個函數(shù):OnBeginPrinting();OnPrint();OnEndPrinting(); 而以 OnPrint 最為復(fù)雜,它是我們要寫大量代碼實現(xiàn)我們打印功能的地方。對于默認的OnPrint實現(xiàn)是調(diào)用CView的OnDraw,也就是和繪制視圖類的客戶區(qū)的內(nèi)容完全相同的方法來在打印機上繪圖。實
7、際中我們在兩種地方繪圖的內(nèi)容是完全不同的,可能用戶在客戶區(qū)繪的是一個曲線,而在打印機上要繪制表格和數(shù)據(jù)。OnPrint(CDC* pDC, CPrintInfo* pInfo)的第二個參數(shù)是一個CPrintInfo類型的指針,我們可以從這個指針指向的對象中獲得很多信息,如總共的頁數(shù),當前的頁數(shù),這在打印頁眉頁腳時可能是很有用的信息。CPrintInfo的定義如下:struct structCPrintInfo / Printing information structureCPrintInfo();CPrintInfo();CPrintDialog* m_pPD; / pointer to p
8、rint dialogBOOL m_bDocObject; / TRUE if printing by IPrint interfaceBOOL m_bPreview; / TRUE if in preview modeBOOL m_bDirect; / TRUE if bypassing Print DialogBOOL m_bContinuePrinting;/ set to FALSE to prematurely end printingUINT m_nCurPage; / Current pageUINT m_nNumPreviewPages; / Desired number of
9、 preview pagesCString m_strPageDesc; / Format string for page number displayLPVOID m_lpUserData; / pointer to user created structCRect m_rectDraw; / rectangle defining current usable page area/ these only valid if m_bDocObjectUINT m_nOffsetPage; / offset of first page in combined IPrint jobDWORD m_d
10、wFlags; / flags passed to IPrint:Printvoid SetMinPage(UINT nMinPage);void SetMaxPage(UINT nMaxPage);UINT GetMinPage() const;UINT GetMaxPage() const;UINT GetFromPage() const;UINT GetToPage() const;UINT GetOffsetPage() const;OnBeginPrinting()通常用來設(shè)定要打印的總頁數(shù),以及一些和頁面尺寸有關(guān)的初始化工作,在OnBeginPrinting()中設(shè)定打印的頁數(shù)是必
11、要的,默認的頁數(shù)是只有一頁,如果開發(fā)人員打印的頁數(shù)大于1,則必須在此函數(shù)中設(shè)定打印的頁數(shù)。然后在OnPrint(CDC* pDC, CPrintInfo* pInfo)中用pInfo-> m_nCurPage獲取當前的頁碼,根據(jù)當前的頁碼打印該頁相應(yīng)的內(nèi)容。OnEndPrinting用來釋放在OnBeginPrinting中申請的資源,如果沒有申請,則不需重載該函數(shù)。關(guān)于打印預(yù)覽只需要將自己的執(zhí)行打印預(yù)覽功能的命令I(lǐng)D和CView:OnFilePrintPreview關(guān)聯(lián)起來就行了,具體方法是在用戶的視圖類的MessageMap中加入:ON_COMMAND(ID_FILE_PRINT_P
12、REVIEW, CView:OnFilePrintPreview);其中ID_FILE_PRINT_PREVIEW是默認的ID,開發(fā)人員也可以使用自己的ID。其實只要重載了OnPrint函數(shù),在打印和打印預(yù)覽中就可以重用該函數(shù)了。到現(xiàn)在為止,相信讀者已經(jīng)對利用MFC的文檔視圖結(jié)構(gòu)來實現(xiàn)一個包含打印和打印預(yù)覽功能的程序有了一個總體的認識了,本文還針對該方法給出了一個示例代碼,代碼來自Jeff Prosise 的MFC windows程序設(shè)計,見參考文獻1。2、沒有文檔視圖結(jié)構(gòu)的程序中利用MFC進行打印程序的編寫如果程序不是文檔視圖結(jié)構(gòu)的,我們要使用MFC來進行打印,則可以通過建立一個虛擬的文檔視
13、圖結(jié)構(gòu)來進行打印,其實MFC的打印的強大功能是在CView里提供的,而CView類的對象是一個子窗口,它必須是某一個框架窗口的子窗口,而在對話框程序中,我們只需要打印,而不需要顯示這個框架窗口和視圖。我們以按下按鈕"打印"來執(zhí)行打印程序,例如按鈕為ID為IDC_PNT,消息相應(yīng)函數(shù)為OnPnt(),即:ON_BN_CLICKED(IDC_PNT, OnPnt);需要在OnPnt中建立一個框架窗口,同時使某個CView類的對象為該窗口的子窗口。因此筆者建立了兩個類,一個為框架窗口類CPrintFrame,另一個為CPrintView,具體的內(nèi)容見示例代碼。在新建一個用于打印的
14、虛擬框架窗口時,需要將執(zhí)行打印的對話框的指針傳給框架窗口,這以便在對話框來響應(yīng)WM_BEGIN_PRINTING和WM_END_PRINTING消息,使對話框可以完成打印的初始化和釋放操作。在執(zhí)行一個打印任務(wù)時,將打印的流程交給CView來進行,而這個CView是虛擬的,只是用來完成打印一些操作,其它內(nèi)容則完全不負責處理,而當要執(zhí)行CView:OnPrint時,則又將處理的具體內(nèi)容傳回到對話框,而對話框則只需要響應(yīng)WM_MY_PRINT消息即可:pFrame->m_pCallerDlg->SendMessage(WM_MY_PRINT,(WPARAM) pDC, (LPARAM)
15、pInfo);使打印的具體處理又傳回到對話框中,使開發(fā)人員根據(jù)具體的需要寫WM_MY_PRINT的處理函數(shù)就可以實現(xiàn)打印,而CView:OnPrint(CDC* pDC, CPrintInfo* pInfo)的參數(shù)也從WM_MY_PRINT的消息參數(shù)傳出來,在用戶的對話框程序中,需要寫的代碼就很少,主要有以下幾個步驟,建立一個CPrintFrame的對象,設(shè)該對象的指針為pFrame,并將對話框的指針傳給該對象的m_pCallerDlg,即pFrame->m_pCallerDlg = this; 調(diào)用對象的Create函數(shù)創(chuàng)建框架窗口;例如pFrame->Create(NULL,&
16、quot;頻譜打印",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0); 如果要執(zhí)行打印,則調(diào)用pFrame->m_pView->OnMyPrint(); 如果要執(zhí)行打印預(yù)覽,則調(diào)用:pFrame->m_pView->OnMyPrintPreview(); 例如:void CDlgPrintDlg:OnPrint() /執(zhí)行打印功能CPrintFrame *pFrame = new CPrintFrame;pFrame->m_pCallerDlg = this;pFrame->Create(NULL,"Curve Pr
17、int",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0);pFrame->m_pView->OnMyPrint();void CDlgPrintDlg:OnPrintPreview() /執(zhí)行打印預(yù)覽功能CPrintFrame *pFrame = new CPrintFrame;pFrame->m_pCallerDlg = this;pFrame->Create(NULL,"Curve Print Preview",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0);pFrame->m_pVie
18、w->OnMyPrintPreview(); 在對話框中響應(yīng) WM_BEGIN_PRINTING, WM_END_PRINTING,WM_MY_PRINT消息,分別完成打印的初始化,釋放和具體的打印操作;如在示例程序中添加了三個消息響應(yīng)函數(shù)來執(zhí)行該功能。ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting)ON_MESSAGE(WM_END_PRINTING,OnEndPrinting)ON_MESSAGE(WM_MY_PRINT,OnMyPrint)其中OnMyPrint是跟具體要打印什么內(nèi)容有關(guān)的開發(fā)人員要重點完成的代碼,可以打印表格,圖片,數(shù)據(jù),只要GDI繪圖可以進行的操作在這里都可以完成。由于打印預(yù)覽的一部分工作在CView類里完成,因此在用戶程序中只需要相應(yīng)WM_MY_PRINT消息就可以執(zhí)行打印預(yù)覽的功能,而不需要另外編寫打印預(yù)覽代碼。本文提供的CPrintFrame和CPrintView類是連個可重用的類,開發(fā)者只需要把這兩個類對應(yīng)的四個文件拷貝到工程文件所在目錄中(PrintFrame.h, PringtView.h,PrintFrame.cpp, PrintView.cpp),并將這四個文件加入工程,并在需要執(zhí)行打印功能的代碼處加入 #include "PrintFram
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商務(wù)框架完整年終總結(jié)
- 2024護理核心制度培訓(xùn)
- 物業(yè)品質(zhì)管理培訓(xùn)
- 培訓(xùn)家政人的禮儀課件
- 2024-2025學年第一學期初二物理期中考試卷
- 初中八年級英語上學期期中考前測試卷(仁愛版)含答案解析
- 中國商業(yè)地產(chǎn)物業(yè)與資產(chǎn)管理白皮書 2024
- T-ZFDSA 09-2024 茯苓煲雞湯制作標準
- 高中物理第十一章機械振動1簡諧運動課件新人教版選修3-
- 語篇型語法填空題的研究
- 財務(wù)預(yù)算編制說明范文(通用十四篇)
- 2021年蘇州工業(yè)職業(yè)技術(shù)學院輔導(dǎo)員招聘試題及答案解析
- 小學科學招聘考試試題含答案(五套)
- 幼兒園大班語言活動《好長好長的電話》教案
- 機械工程師招聘
- 身份證號碼前6 位表示的地區(qū)對照表
- 殘疾人政策解讀課件
- 張家口市基層診所基本公共衛(wèi)生服務(wù)醫(yī)療機構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 五年級《小學生安全教育》課件
- 監(jiān)理工程合理化建議
- 高中校園五防安全教育主題班會課件
評論
0/150
提交評論