成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

Viusal C++6.0實(shí)現(xiàn)文檔的分頁(yè)打印

2010-08-28 10:45:15來(lái)源:西部e網(wǎng)作者:

  在Windows應(yīng)用程序開(kāi)發(fā)過(guò)程中,實(shí)現(xiàn)文檔打印功能是每一個(gè)開(kāi)發(fā)人員都不得不面對(duì)的問(wèn)題。在使用Visual C++6.0這一開(kāi)發(fā)工具的情況下,雖然它的AppWizard生成的應(yīng)用程序框架中缺省地包括打印功能,但是如何具體實(shí)現(xiàn)打印功能的確是一件非常繁雜的事情,尤其是要實(shí)現(xiàn)文檔的分頁(yè)打印,更是一個(gè)讓很多初學(xué)者感到困惑的問(wèn)題。筆者結(jié)合自己學(xué)習(xí)體會(huì),談一談如何實(shí)現(xiàn)文檔的分頁(yè)打印功能,希望可以對(duì)廣大讀者朋友們起到一定的幫助。

  一、MFC程序默認(rèn)的打印流程

  Visual C++6.0的應(yīng)用程序向?qū)ВˋppWizard)生成的應(yīng)用程序具備了實(shí)現(xiàn)打印功能的基本框架,當(dāng)用戶從菜單中選擇Print命令時(shí),應(yīng)用程序就用ID_FILE_PRINT命令消息調(diào)用程序視圖類的缺省處理函數(shù)OnFilePrint()來(lái)開(kāi)始打印過(guò)程,并創(chuàng)建用語(yǔ)打印的設(shè)備環(huán)境,來(lái)滿足應(yīng)用程序特定的需要。其中要重載應(yīng)用程序視圖類的幾個(gè)相應(yīng)函數(shù),其函數(shù)表如圖一所示:

函數(shù) 說(shuō)明
OnBeginPrinting() 重載此函數(shù)來(lái)創(chuàng)建在打印文檔時(shí)所需的資源,如字體等。在此也可以設(shè)置最大頁(yè)數(shù)。
OnDraw() 該函數(shù)提供三重服務(wù),在框架窗口、預(yù)覽窗口和打印機(jī)上顯示數(shù)據(jù),具體在哪里顯示,依賴于作為函數(shù)參數(shù)傳遞的設(shè)備環(huán)境。
OnEndPrinting() 重載此函數(shù)用來(lái)釋放在OnBeginPrinting()中創(chuàng)建的資源。
OnPrepareDC() 重載此函數(shù)來(lái)修改用于顯示或打印文檔的設(shè)備環(huán)境,可以在此處理?yè)Q頁(yè)。
OnPreparePrinting() 提供打印文檔的最大頁(yè)數(shù),如果在此不設(shè)置頁(yè)數(shù),必須在OnBeiginPrinting()中設(shè)置。
OnPrint() 提供附加打印服務(wù),如在Cview::OnDraw()函數(shù)中不提供的打印頁(yè)眉、頁(yè)腳。
               表一、實(shí)現(xiàn)打印功能需要重載的幾個(gè)CView類成員函數(shù)

  OnFilePrint()函數(shù)一開(kāi)始就調(diào)用OnPreparePrinting()函數(shù),該函數(shù)缺省時(shí)則調(diào)用DoPreparePrinting()函數(shù)來(lái)顯示打印對(duì)話框,創(chuàng)建的OnPreparePrinting()程序如下:

BOOL CmyView::OnpreparePrinting(CprintInfo *pInfo)
{
 //default preparetion
 return DoPreparePrinting(pInfo);
}

  程序中,OnPreparePrinting()提供一個(gè)指向CprintInfo對(duì)象的指針參數(shù),使用此對(duì)象,應(yīng)用程序能夠獲取關(guān)于打印作業(yè)的信息,同時(shí)對(duì)屬性(例如最大頁(yè)數(shù))進(jìn)行初始化。DoPreparePrinting()顯示對(duì)話框時(shí),由用戶設(shè)置CprintInfo類的許多數(shù)據(jù)成員變量供應(yīng)用程序使用或再設(shè)置,即用于創(chuàng)建整個(gè)打印的設(shè)備環(huán)境。

  打印過(guò)程都要用到CprintInfo結(jié)構(gòu),它里面保存了打印任務(wù)的信息。OnPreparePrinting()重載是為了指明打印文件的長(zhǎng)度。在調(diào)用Cview::DoPreparePrinting()之前,可用其參數(shù)來(lái)修改CprintInfo結(jié)構(gòu)。重載OnPreparePrinting()還可以使用CprintInfo結(jié)構(gòu)的成員函數(shù)SetMaxPage()、SetMinPage()來(lái)設(shè)置文檔的最大、最小頁(yè)數(shù)。當(dāng)把CprintInfo結(jié)構(gòu)中表明文檔是否被直接打印標(biāo)志變量m_bDirect設(shè)置為TRUE時(shí),調(diào)用DoPreparePrinting()就不再顯示打印對(duì)話框。此時(shí),由于沒(méi)有打印對(duì)話框,可以用SetToPage()和SetFromPage()設(shè)置打印的起始頁(yè)。

  接下來(lái),打印程序調(diào)用視圖類的OnBegingPrinting()函數(shù),該函數(shù)進(jìn)一步進(jìn)行初始化工作,并傳送一個(gè)指向設(shè)備環(huán)境的指針和一個(gè)指向CprintInfo結(jié)構(gòu)的指針。

  在開(kāi)始逐頁(yè)打印之前,調(diào)用OnPrepareDC()函數(shù),這是每一頁(yè)執(zhí)行一次的打印循環(huán)的開(kāi)始,該函數(shù)的修改用于顯示或打印文檔的設(shè)備環(huán)境,為每頁(yè)設(shè)置映像模式,創(chuàng)建字體,檢查文檔是否結(jié)束。可以把CPrintInfo結(jié)構(gòu)中的m_bContinuePrinting標(biāo)志設(shè)置為False來(lái)發(fā)出打印完畢信號(hào)以終止打印作業(yè)。

  在調(diào)用了OnPrepareDC()函數(shù)之后,ID_FILE_PRINT消息處理函數(shù)調(diào)用了OnPrint()函數(shù),該函數(shù)的缺省功能是把打印工作放在視圖類的OnDraw()函數(shù)中進(jìn)行,它傳送一個(gè)指向設(shè)備環(huán)境的指針和一個(gè)指向CprintInfo結(jié)構(gòu)的指針,負(fù)責(zé)每一頁(yè)的打印。

  歸納起來(lái),MFC應(yīng)用程序的打印流程如下:


圖一、打印流程圖

  二、文檔分頁(yè)打印功能的實(shí)現(xiàn)

  為了說(shuō)明如何實(shí)現(xiàn)文檔的分頁(yè)打印功能,下面給出了分頁(yè)打印輸出幾個(gè)矩形的實(shí)例。首先啟動(dòng)Visual C++6.0生成一個(gè)應(yīng)用程序框架,并重載視圖類的OnBeginPrinting()函數(shù),在該函數(shù)中獲取設(shè)備環(huán)境信息,設(shè)置頁(yè)高、頁(yè)數(shù),由此設(shè)置打印對(duì)話框的初值,具體代碼如下:

Void CmyView::OnBeginPrinting(CDC*pdc,CprintInfo *pInfo)
{
 CmyDoc *pDoc=GetDocment();//得到文檔指針;
 ASSERT_VALID(pDoc);//確認(rèn)指針的有效性;
 int pageHeitht=pDC->GetDeviceCaps(VERTRES);//由頁(yè)頂?shù)巾?yè)底可打印點(diǎn)的個(gè)數(shù),從設(shè)備環(huán)境中得到頁(yè)面高度;
 int logPixelsy=pDC->GetDeviceCaps(LOGPEXELSY);//每英寸的點(diǎn)數(shù);
 int rectHeight=(int)(4.2*logPixelsy);//計(jì)算矩形的高度,可以由用戶自行設(shè)置;
 int numPages=Pdoc->m_numRects*rectHeight/pageHeight+1;//由矩形數(shù)計(jì)算輸出頁(yè)數(shù);
 pInfo->SetMaxPage(numPages);//初始化pInfo結(jié)構(gòu);
}

  為了將矩形打印輸出,還應(yīng)該重載Cview::OnPrepareDC()函數(shù),實(shí)現(xiàn)輸出圖形的位置定位,函數(shù)首先測(cè)試應(yīng)用程序是否正在調(diào)用CDC類的成員函數(shù)IsPrinting()打印數(shù)據(jù),若正在打印,則判斷當(dāng)前頁(yè)的數(shù)據(jù)屬于哪一部分,由GetDeviceCaps()函數(shù)得當(dāng)環(huán)境設(shè)備信息;接著確定打印新視圖的原點(diǎn),并將原點(diǎn)值由SetViewportOrg()傳遞給設(shè)備環(huán)境。具體代碼如下:

Void CmyView::OnPrepareDC(CDC*pDC,CprintInfo *pInfo)
{
 if(pDC->IsPrinting())//若正在進(jìn)行打印則判斷當(dāng)前頁(yè)數(shù)據(jù);
 {
  int pageHeight=pDC->GetDeviceCaps(VERTRES);
  int originY=pageHeight*((pInfo->m_nCurpage-1);
  pDC->SetViewportOrg(0,-originY)
 }
 Cview::OnPrepareDC(pDC,pInfo);
}

  三、小結(jié)

  通過(guò)上文的介紹,相信讀者朋友應(yīng)該對(duì)Visual C++編程實(shí)現(xiàn)文檔的分頁(yè)打印功能有了一定的了解,大家可以在此基礎(chǔ)上,參考相關(guān)學(xué)習(xí)資料,根據(jù)應(yīng)用程序的不同需要,編制實(shí)現(xiàn)不同的打印程序。
關(guān)鍵詞:ViusalC++6.0
主站蜘蛛池模板: 万源市| 顺昌县| 左贡县| 西吉县| 韶山市| 凤台县| 武宁县| 砚山县| 隆昌县| 涟水县| 通道| 屏南县| 朝阳市| 木兰县| 香河县| 图木舒克市| 江北区| 新化县| 尉犁县| 东平县| 秭归县| 景东| 梨树县| 青州市| 永善县| 三亚市| 启东市| 肥西县| 青田县| 紫云| 惠来县| 荥阳市| 平乡县| 镇沅| 乌兰察布市| 余江县| 永康市| 玉环县| 南昌市| 尉犁县| 会宁县|