• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            笑看風云淡

            寵辱不驚,看庭前花開花落;去留無意,望天空云卷云舒
            posts - 96, comments - 48, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理
            在Windows應用程序開發過程中,實現文檔打印功能是每一個開發人員都不得不面對的問題。在使用Visual C++6.0這一開發工具的情況下,雖然它的AppWizard生成的應用程序框架中缺省地包括打印功能,但是如何具體實現打印功能的確是一件非常繁雜的事情,尤其是要實現文檔的分頁打印,更是一個讓很多初學者感到困惑的問題。筆者結合自己學習體會,談一談如何實現文檔的分頁打印功能,希望可以對廣大讀者朋友們起到一定的幫助。

              一、MFC程序默認的打印流程

              Visual C++6.0的應用程序向導(AppWizard)生成的應用程序具備了實現打印功能的基本框架,當用戶從菜單中選擇Print命令時,應用程序就用ID_FILE_PRINT命令消息調用程序視圖類的缺省處理函數OnFilePrint()來開始打印過程,并創建用語打印的設備環境,來滿足應用程序特定的需要。其中要重載應用程序視圖類的幾個相應函數,其函數表如圖一所示:

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

              OnFilePrint()函數一開始就調用OnPreparePrinting()函數,該函數缺省時則調用DoPreparePrinting()函數來顯示打印對話框,創建的OnPreparePrinting()程序如下:

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

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

              打印過程都要用到CprintInfo結構,它里面保存了打印任務的信息。OnPreparePrinting()重載是為了指明打印文件的長度。在調用Cview::DoPreparePrinting()之前,可用其參數來修改CprintInfo結構。重載OnPreparePrinting()還可以使用CprintInfo結構的成員函數SetMaxPage()、SetMinPage()來設置文檔的最大、最小頁數。當把CprintInfo結構中表明文檔是否被直接打印標志變量m_bDirect設置為TRUE時,調用DoPreparePrinting()就不再顯示打印對話框。此時,由于沒有打印對話框,可以用SetToPage()和SetFromPage()設置打印的起始頁。

              接下來,打印程序調用視圖類的OnBegingPrinting()函數,該函數進一步進行初始化工作,并傳送一個指向設備環境的指針和一個指向CprintInfo結構的指針。

              在開始逐頁打印之前,調用OnPrepareDC()函數,這是每一頁執行一次的打印循環的開始,該函數的修改用于顯示或打印文檔的設備環境,為每頁設置映像模式,創建字體,檢查文檔是否結束。可以把CPrintInfo結構中的m_bContinuePrinting標志設置為False來發出打印完畢信號以終止打印作業。

              在調用了OnPrepareDC()函數之后,ID_FILE_PRINT消息處理函數調用了OnPrint()函數,該函數的缺省功能是把打印工作放在視圖類的OnDraw()函數中進行,它傳送一個指向設備環境的指針和一個指向CprintInfo結構的指針,負責每一頁的打印。

              歸納起來,MFC應用程序的打印流程如下:


            圖一、打印流程圖

              二、文檔分頁打印功能的實現

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

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

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

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

              三、小結

              通過上文的介紹,相信讀者朋友應該對Visual C++編程實現文檔的分頁打印功能有了一定的了解,大家可以在此基礎上,參考相關學習資料,根據應用程序的不同需要,編制實現不同的打印程序。
            亚洲AV伊人久久青青草原| 国产精品久久久久久一区二区三区 | 青青草国产精品久久久久| 久久久中文字幕| 久久久久99这里有精品10| 亚洲中文字幕久久精品无码喷水| 久久天天躁狠狠躁夜夜网站| 国产精品视频久久久| 欧美精品丝袜久久久中文字幕 | 久久亚洲精精品中文字幕| 99久久99这里只有免费费精品| 国内精品伊人久久久久影院对白| 综合久久精品色| 97精品久久天干天天天按摩| 亚洲午夜精品久久久久久浪潮| 97精品久久天干天天天按摩| 亚洲精品无码久久不卡| 久久被窝电影亚洲爽爽爽| 久久99热这里只有精品国产| 国内精品久久久久影院网站| 大伊人青草狠狠久久| 午夜久久久久久禁播电影| 伊人久久大香线蕉无码麻豆| 一级做a爰片久久毛片人呢| 久久亚洲AV成人出白浆无码国产| 麻豆久久久9性大片| 午夜精品久久久久久| 久久久久成人精品无码| 99麻豆久久久国产精品免费| 无码日韩人妻精品久久蜜桃| 久久久久亚洲AV无码观看| 久久人人爽人人爽AV片| 一本一道久久精品综合| 中文精品久久久久国产网址| 好属妞这里只有精品久久| 久久99国产乱子伦精品免费| 国产成人精品综合久久久| 精品综合久久久久久98| 久久精品国产亚洲AV蜜臀色欲| 三级三级久久三级久久| 亚洲精品国产字幕久久不卡|