VC 對話方塊程式列印及列印預覽的實現(三)

2021-06-10 10:55:34 字數 3514 閱讀 6323

void cview::onfileprint()

onbeginprinting(&dcprint, &printinfo);

onpreparedc(&dcprint, &printinfo);

onprint(&dcprint, &printinfo);

onendprinting(&dcprint, &printinfo); // clean up after printing}

其中加粗的**行為可以過載的虛函式,根據不同的使用者,其內容會不同。對於 onprepareprinting() 函式的具體內容必須有 return doprepareprinting(pinfo);這是在乙個列印過程中最先呼叫的。當然也可以包含一些其它的列印初始化操作。我們最主要的是要過載三個函式:

onbeginprinting();

onprint();

onendprinting();

而以 onprint 最為複雜,它是我們要寫大量**實現我們列印功能的地方。對於預設的onprint實現是呼叫cview的ondraw,也就是和繪製檢視類的客戶區的內容完全相同的方法來在印表機上繪圖。實際中我們在兩種地方繪圖的內容是完全不同的,可能使用者在客戶區繪的是乙個曲線,而在印表機上要繪製**和資料。onprint(cdc* pdc, cprintinfo* pinfo)的第二個引數是乙個cprintinfo型別的指標,我們可以從這個指標指向的物件中獲得很多資訊,如總共的頁數,當前的頁數,這在列印頁首頁尾時可能是很有用的資訊。cprintinfo的定義如下:

struct structcprintinfo // printing information structure;

onbeginprinting()通常用來設定要列印的總頁數,以及一些和頁面尺寸有關的初始化工作,在onbeginprinting()中設定列印的頁數是必要的,預設的頁數是只有一頁,如果開發人員列印的頁數大於1,則必須在此函式中設定列印的頁數。然後在onprint(cdc* pdc, cprintinfo* pinfo)中用pinfo-> m_ncurpage獲取當前的頁碼,根據當前的頁碼列印該頁相應的內容。onendprinting用來釋放在onbeginprinting中申請的資源,如果沒有申請,則不需過載該函式。

關於列印預覽只需要將自己的執行列印預覽功能的命令id和cview::onfileprintpreview關聯起來就行了,具體方法是在使用者的檢視類的messagemap中加入:on_command(id_file_print_preview, cview::onfileprintpreview);

其中id_file_print_preview是預設的id,開發人員也可以使用自己的id。其實只要過載了onprint函式,在列印和列印預覽中就可以重用該函式了。到現在為止,相信讀者已經對利用mfc的文件檢視結構來實現乙個包含列印和列印預覽功能的程式有了乙個總體的認識了,本文還針對該方法給出了乙個示例**,**來自jeff prosise 的《mfc windows程式設計》,見參考文獻[1]。

2、沒有文件檢視結構的程式中利用mfc進行列印程式的編寫

如果程式不是文件檢視結構的,我們要使用mfc來進行列印,則可以通過建立乙個虛擬的文件檢視結構來進行列印,其實mfc的列印的強大功能是在cview裡提供的,而cview類的物件是乙個子視窗,它必須是某乙個框架視窗的子視窗,而在對話方塊程式中,我們只需要列印,而不需要顯示這個框架視窗和檢視。我們以按下按鈕"列印"來執行列印程式,例如按鈕為id為idc_pnt,訊息相應函式為onpnt(),即:

on_bn_clicked(idc_pnt, onpnt);

需要在onpnt中建立乙個框架視窗,同時使某個cview類的物件為該視窗的子視窗。因此筆者建立了兩個類,乙個為框架視窗類cprintframe,另乙個為cprintview,具體的內容見示例**。在新建乙個用於列印的虛擬框架視窗時,需要將執行列印的對話方塊的指標傳給框架視窗,這以便在對話方塊來響應wm_begin_printing和wm_end_printing訊息,使對話方塊可以完成列印的初始化和釋放操作。在執行乙個列印任務時,將列印的流程交給cview來進行,而這個cview是虛擬的,只是用來完成列印一些操作,其它內容則完全不負責處理,而當要執行cview::onprint時,則又將處理的具體內容傳回到對話方塊,而對話方塊則只需要響應wm_my_print訊息即可:

pframe->m_pcallerdlg->sendmessage(wm_my_print,(wparam) pdc, (lparam) pinfo);

pframe->m_pview->onmyprintpreview();

例如:在對話方塊中響應 wm_begin_printing, wm_end_printing,wm_my_print訊息,分別完成列印的初始化,釋放和具體的列印操作;如在示例程式中新增了三個訊息響應函式來執行該功能。

on_message(wm_begin_printing,onbeginprinting)

on_message(wm_end_printing,onendprinting)

on_message(wm_my_print,onmyprint)

其中onmyprint是跟具體要列印什麼內容有關的開發人員要重點完成的**,可以列印**,,資料,只要gdi繪圖可以進行的操作在這裡都可以完成。由於列印預覽的一部分工作在cview類裡完成,因此在使用者程式中只需要相應wm_my_print訊息就可以執行列印預覽的功能,而不需要另外編寫列印預覽**。

本文提供的cprintframe和cprintview類是連個可重用的類,開發者只需要把這兩個類對應的四個檔案拷貝到工程檔案所在目錄中(printframe.h, pringtview.h,printframe.cpp, printview.cpp),並將這四個檔案加入工程,並在需要執行列印功能的**處加入 #include "printframe.h"

#include "printview.h"

然後按照上述5個步驟進行即可以實現乙個功能完整的列印程式,利用上述類實現對話方塊列印不但節省開發者許多時間,而且功能很強大,能達到很專業的水平,但是該方法有乙個缺點,筆者發現如果開發者使用靜態連線的mfc庫時則會出錯,只適用於use mfc in a shelled dll情況,而且必須使程式為debug版本的。

3、示例**的執行效果

圖1 執行列印功能的對話方塊

當按下列印預覽後則會產生乙個框架視窗,顯示列印預覽的內容,如圖2所示:

圖2 列印預覽效果圖

可以在上圖的介面上按兩頁同時對兩頁預覽,如圖3所示:

圖3 兩頁同時預覽效果圖

但有一點需要注意,在預覽介面上的列印按鈕不可用,如果按該"列印"鈕則直接等於將預覽視窗關掉,因此要執行列印功能必須另外在對話方塊的介面上放乙個列印按鈕,如果執行了"列印"功能,則會彈出乙個選擇印表機的對話方塊,如圖4所示。這個對話方塊是mfc的列印結構內建的,不可以消除,當使用者選擇了正確的印表機後則可以列印出具體的內容了。

圖4 印表機選擇對話方塊

4、 結束語

本文從分析mfc的原**入手,利用mfc的cview類提供的列印和列印預覽功能進行了在對話方塊中的列印和列印預覽。利用物件導向的c++寫了兩個可重用類cprintframe和cprintview,實現在對話方塊中的列印和列印預覽功能,極大的簡化了對話方塊列印程式的編寫。

MFC對話方塊列印預覽異常問題解決

昨天在別人的電腦上成功執行了上次我寫的列印預覽程式,但是今天換了一台電腦就不能執行了,讓我覺得非常奇怪。提示的錯誤資訊是 記憶體 x不能為read mfc100d.dll 中有未經處理的異常。奇怪的是,我加了try catch語句後依然出錯。我首先嘗試了dll鏈結和動態鏈結,發現仍然無法解決。由於這...

CAD如何直接列印,不出現列印對話方塊?

主要用到函式說明 mxdrawxcustomfunction mx print 直接列印,不出現列印對話方塊,詳細說明如下 引數說明 double ptlbx 列印的範圍左下角x double ptlby 列印的範圍左下角y double ptrtx 列印的範圍右上角x double ptrty 列...

VP列印過程彈出對話方塊

1.建立對話方塊資源,id為 idd dialog file,有乙個輸入檔名的edit和乙個確定button idok 2.在列印檔案之前新增 彈出乙個輸入檔名字首的視窗 int nflag dialogbox g hinstance,makeintresource idd dialog file ...