青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

笑看風云淡

寵辱不驚,看庭前花開花落;去留無意,望天空云卷云舒
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++編程實現文檔的分頁打印功能有了一定的了解,大家可以在此基礎上,參考相關學習資料,根據應用程序的不同需要,編制實現不同的打印程序。

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩专区| 亚洲一区二区高清视频| 欧美日本二区| 久久精品国产99精品国产亚洲性色| 亚洲精品日韩久久| 欧美大片在线看| 久久婷婷久久| 久久精品国产亚洲a| 性久久久久久久| 亚洲影院一区| 亚洲天天影视| 一区二区三区国产盗摄| 亚洲伦理在线免费看| 亚洲国产日韩欧美综合久久| 影院欧美亚洲| 精品二区视频| 狠狠色伊人亚洲综合网站色| 国产视频亚洲精品| 国产欧美日韩伦理| 国产欧美日韩精品在线| 国产精品自拍小视频| 国产精品综合色区在线观看| 国产精品美女xx| 国产精品一二三四| 国产欧美大片| 国产综合自拍| 黑人一区二区| 一区二区三区在线免费视频| 樱花yy私人影院亚洲| 一区二区亚洲欧洲国产日韩| 一区二区三区在线免费播放| 亚洲高清在线观看一区| 亚洲黄色视屏| 日韩西西人体444www| 一区二区三区成人精品| 亚洲伊人第一页| 性娇小13――14欧美| 久久成人免费网| 久久视频国产精品免费视频在线| 久久这里有精品视频| 欧美激情国产精品| 亚洲开发第一视频在线播放| 一区二区欧美国产| 午夜精品成人在线视频| 久久九九精品| 欧美福利一区二区三区| 欧美日韩一区二区三区四区五区| 国产精品久久久久一区| 国产一区二区三区不卡在线观看 | 国产美女在线精品免费观看| 国产视频综合在线| 亚洲第一毛片| av成人免费在线观看| 午夜国产欧美理论在线播放| 午夜精品福利在线观看| 亚洲国产成人午夜在线一区| 99精品视频免费在线观看| 亚洲自拍偷拍福利| 久久人人97超碰人人澡爱香蕉| 欧美成人精品1314www| 99av国产精品欲麻豆| 欧美一级理论片| 免费视频久久| 国产精品另类一区| 国产综合亚洲精品一区二| 亚洲精品久久久久久久久久久久| 亚洲专区在线视频| 欧美chengren| 一区二区三区日韩精品| 久久精品国产免费看久久精品| 美脚丝袜一区二区三区在线观看| 欧美午夜精品电影| 在线观看日韩av先锋影音电影院| 在线综合亚洲| 久久天天狠狠| av成人免费在线| 久久久精品国产一区二区三区| 欧美日韩成人| 激情综合网激情| 亚洲一区国产一区| 欧美成人精精品一区二区频| 亚洲一区二区三区午夜| 欧美14一18处毛片| 国产偷国产偷亚洲高清97cao| 99re热这里只有精品免费视频| 久久精品人人做人人爽电影蜜月| 亚洲日本成人网| 午夜精品久久| 欧美日韩一级片在线观看| 亚洲第一级黄色片| 欧美一区二区三区喷汁尤物| 亚洲国产精品女人久久久| 久久99伊人| 国产精品日日摸夜夜摸av| 日韩亚洲欧美综合| 免播放器亚洲一区| 午夜在线不卡| 国产精品jizz在线观看美国 | 欧美激情一区二区三区在线| 亚洲免费一级电影| 欧美日韩精品在线视频| 在线免费观看日韩欧美| 欧美一区二区三区免费视频| 9久re热视频在线精品| 男人的天堂亚洲| 黄色成人av在线| 欧美在线亚洲一区| 在线亚洲欧美视频| 欧美女激情福利| 91久久国产综合久久蜜月精品| 久久精品国产视频| 亚洲欧美综合另类中字| 国产精品第一页第二页第三页| 一区二区三区精品在线| 亚洲激情另类| 女人天堂亚洲aⅴ在线观看| 永久免费视频成人| 狂野欧美激情性xxxx欧美| 欧美一区精品| 国产一区二区高清不卡| 久久aⅴ国产欧美74aaa| 午夜亚洲伦理| 国产视频一区在线| 久久精品一区二区国产| 午夜久久福利| 国产视频一区在线观看| 久久国产精品毛片| 欧美一区二区精品| 国产一区二区高清不卡| 久久久久国产精品人| 久久www免费人成看片高清| 国内久久视频| 浪潮色综合久久天堂| 久久久91精品国产一区二区精品| 韩日在线一区| 欧美a级大片| 欧美成人一品| 999亚洲国产精| av成人动漫| 国产精品一区二区视频| 久久国产欧美日韩精品| 欧美大片在线观看| 国产精品久久久久久久久久直播 | 在线观看国产精品淫| 免费成人激情视频| 免费在线视频一区| 在线亚洲电影| 亚洲视频1区2区| 国产免费成人在线视频| 久久久久国产精品麻豆ai换脸| 久久久久免费观看| 亚洲欧洲日韩女同| 日韩午夜在线电影| 国产精品视频yy9299一区| 久久精品一本久久99精品| 久久综合久色欧美综合狠狠| 亚洲精品欧洲| 一区二区精品国产| 国际精品欧美精品| 亚洲成色精品| 国产精品成人一区二区艾草| 久久狠狠一本精品综合网| 久久亚洲一区二区三区四区| 99精品欧美| 亚洲尤物在线视频观看| 影音先锋久久久| 日韩视频一区| 国产视频一区在线观看| 亚洲国产精品一区二区第四页av| 欧美视频一区二区三区四区| 久久精品一区二区三区不卡牛牛| 欧美二区在线| 欧美一区国产一区| 麻豆精品视频| 亚洲欧美日韩天堂| 久久综合给合| 亚洲在线日韩| 久久亚洲免费| 亚洲欧洲99久久| 免费亚洲网站| 性做久久久久久免费观看欧美| 久久婷婷影院| 亚洲一区二区免费视频| 久久婷婷蜜乳一本欲蜜臀| 亚洲免费综合| 美女网站在线免费欧美精品| 亚洲欧美美女| 欧美.com| 久久久久欧美精品| 欧美三级欧美一级| 欧美成人嫩草网站| 国产精品视屏| 亚洲激情影视| 狠狠色丁香久久婷婷综合丁香| 99re热精品| 亚洲国产欧美一区二区三区久久 | 亚洲一二三区在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲欧美制服中文字幕| 欧美国产日韩精品|