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

VC數據庫編程中的打印控制
2003-12-4加入  來自賽迪網  作者李佑民  1條評論  點擊2287
       
  VC數據庫編程中的打印控制比較復雜,但它也給程序員最大的靈活性,而這種靈活性正是我們需要的。因為各行業、部門的報表一般都不太規整,特別是表頭部分,二、三重嵌套的情況很常見。下面我們就開發中碰到的一些問題與同行們探討。 

  Document/View框架之外的打印 

  熟悉VC的程序員都知道Microsoft 的AppWizard生成的應用程序框架中,可以選擇免費的打印及打印預覽功能,但前提是必須選擇Document/View結構。然而我們的數據庫應用中一般都不需要一個文檔類來保存文檔,因為數據庫(源)就是我們的文檔,數據一般是在一個對話框或視中與用戶交互,編輯或修改結果直接通過數據庫引擎寫回數據庫中。我們的程序主框架要么是基于對話框的、要么是基于無文檔類的單視(或多視)結構,在這種情況下,AppWizard 在打印控制部分并不能給我們任何幫助,只能自己負責完成打印控制。 

  總結起來,一次打印操作要遵循以下步驟: 

  1.得到或生成打印設備場景,可通過顯示打印對話框讓用戶選擇打印機與紙張等設置,也可在程序中直接取系統缺省打印機設置,然后根據報表格式設置紙張大小和打印方向; 

  2.開始在該設備場景中的一次打印作業,實際打印報表內容,終止打印作業; 

  3.清除打印設備場景,完成本次打印操作。 

  在下面的例子中,我們在一個對話框中讓用戶選擇打印某個報表,沒有顯示打印設置對話框,而是直接取系統缺省打印機設置,然后根據報表格式設置紙張大小和打印方向。之所以這樣做是因為各行業、部門的報表格式一般都是至上而下的統一格式。函數DoPreparePrintDC()、DoPrint()和DoClearPrintDC()分別對應上述的三個步驟: 

  BOOL CMyDialog::DoPreparePrintDC() 

  // 準備打印場景 

  { 

   #define  FONTSIZE 14 

   // 獲取打印機的設備屬性 

   CPrintDialog dlgPrint( FALSE ); 

   // 得到當前系統缺省打印機設置 

   if(!dlgPrint.GetDefaults()) return FALSE; 

   LPDEVMODE pDM=dlgPrint.GetDevMode(); 

   if(pDM==NULL) return FALSE; 

   ::GlobalUnlock(pDM); 

   // 聯結打印DC,m—hDC是定義為HDC m—hDC的類成員變量 

   m—hDC=dlgPrint.CreatePrinterDC(); 

   // m—DC是定義為CDC m—DC的類成員變量 

   if(!m—DC.Attach(m—hDC) return FALSE; 

   // 設置打印標志 

   m—DC.m—bPrinting=TRUE; 

   short cxInch=m—DC.GetDeviceCaps(LOGPIXELSX); 

   short cyInch=m—DC.GetDeviceCaps(LOGPIXELSY); 

   // 建立打印字體,m—fontPrint 是定義為CFont m_fontPrint的類成員變量 

   if(!m—fontPrint.CreateFont(MulDiv(FONTSIZE, -cyInch, 72),0,0,0, FW—NORMAL,0,0,0, GB2312—CHARSET, OUT—CHARACTER—PRECIS, CLIP—CHARACTER—PRECIS,DEFAULT—QUALITY, DEFAULT—PITCH|FF—DONTCARE, HFONTNAME) 

   return FALSE; 

   return TRUE;} 

  void CDlgDataPrint::DoClearPrintDC() 

  // 清除打印場景 

  { m—fontPrint.DeleteObject(); 

   m—DC.Detach(); 

   ::DeleteDC( m—hDC );} 

  void CDlgDataPrint::DoPrint() 

  // 實際打印輸出 

  { if(DoPreparePrintDC()==FALSE) return; 

   // 開始一次打印作業 

   CString str; 

   str.LoadString(AFX—IDS—APP—TITLE); 

   DOCINFO di; 

   ::ZeroMemory (&di, sizeof (DOCINFO)); 

   di.cbSize=sizeof (DOCINFO); 

   di.lpszDocName=str; 

   m—DC.StartDoc(&di); 

   m—DC.StartPage(); 

   // 將打印字體選進設備場景 

   CFont* pOldFont=m—DC.SelectObject(&m—fontPrint); 

   // 輸出報表,建議用CDC::DrawText()函數便于控制打印范圍 

   ... 

   // 終止打印作業 

   m—DC.EndPage(); 

   m—DC.EndDoc(); 

   m—DC.SelectObject(pOldFont); 

   // 清除打印場景 

   DoClearPrintDC();} 

  表格問題 

  對格式固定或表頭、表體比較復雜的情況,特別是有嵌套表格的情況下,我們認為先將打印結果以文本形式寫入一臨時文件,然后再對文件進行打印輸出的方法會使事情簡單一些。因為這樣在程序中就可以只關心數據(表體)的輸出,而表頭則可以固定格式存入數據庫。 

  但是,我們在對文本形式的報表進行打印輸出時卻發現一個有趣的現象,有時輸出結果的相鄰兩行表格豎線不能對齊,而有時又可以。原來是 Windows 圖形輸出的問題,只要我們在建立打印字體時,字體的高度是偶數就可保證豎線對齊,如果是奇數則不能對齊。知道了原因,在建立打印字體時只需加入如下代碼即可: 

  ... 

  #define  FONTSIZE 14 

  #define  HFONTNAME ″宋體″ 

  // 建立打印字體,m—fontPrint是定義為CFont m—fontPrint的類成員變量 

  int nFontHeight=MulDiv(FONTSIZE,-cyInch, 72); 

  if(nFontHeight % 2) nFontHeight++; 

  if(!m—fontPrint.CreateFont(nFontHeight, 0, 0, 0, FW—NORMAL, 0, 0,0,GB2312—CHARSET, OUT—CHARACTER—PRECIS, CLIP—CHARACTER—PRECIS,DEFAULT—QUALITY, DEFAULT—PITCH | FF—DONTCARE, HFONTNAME)) 

   return FALSE; 

  ... 

  還有一點小技巧,輸出文本形式的報表時,對報表的橫線只需要輸出其正常高度的二分之一或三分之一,這樣報表看起來更緊湊美觀。這也是我們在前面建議用CDC::DrawText()進行繪制輸出的原因。 
Posted on 2005-11-11 14:31 艾凡赫 閱讀(765) 評論(0)  編輯 收藏 引用 所屬分類: ADO編程技術
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中文av字幕一区| 久久大逼视频| 午夜在线精品偷拍| 免费永久网站黄欧美| 亚洲精品视频啊美女在线直播| 先锋资源久久| 国产精品成av人在线视午夜片| 亚洲国产中文字幕在线观看| 欧美一级专区免费大片| 亚洲精品视频免费在线观看| 久久中文欧美| 韩国精品在线观看| 久久久久88色偷偷免费| 欧美成人精品在线播放| 久久久久久黄| 国产麻豆日韩| 国产精品美女xx| 亚洲视频欧美在线| 亚洲精品女av网站| 久久蜜桃香蕉精品一区二区三区| 国产偷国产偷亚洲高清97cao | 一区二区三区日韩在线观看| 免费欧美高清视频| 久久婷婷国产综合精品青草| 欧美日韩亚洲一区| 亚洲视频观看| 亚洲一区图片| 国产一区视频网站| 久久综合九色综合欧美就去吻| 性8sex亚洲区入口| 狠狠色综合网站久久久久久久| 久久久久高清| 久久深夜福利| 亚洲精品国产精品国自产在线 | 欧美成人激情在线| 你懂的视频一区二区| 亚洲人久久久| 亚洲国产欧美一区| 欧美日韩免费| 午夜免费电影一区在线观看| 亚洲免费影院| 影音先锋日韩精品| 亚洲国产精品久久精品怡红院| 欧美韩日一区| 亚洲欧美区自拍先锋| 欧美伊人久久| 亚洲日本电影| 日韩视频在线你懂得| 亚洲精品一区在线观看香蕉| 国产亚洲精品久久飘花| 另类天堂视频在线观看| 亚洲一区二区在线| 在线成人性视频| 久久精品夜色噜噜亚洲a∨| 亚洲精品少妇| 欧美日韩国产限制| 久久精品噜噜噜成人av农村| 久久天堂成人| 国内精品久久久久伊人av| 亚洲第一成人在线| 日韩午夜在线电影| 黄色成人免费观看| 一本大道av伊人久久综合| 精品福利免费观看| 夜夜爽www精品| 亚洲国产天堂久久综合| 在线亚洲自拍| 在线免费日韩片| 亚洲国产91| 国产亚洲综合在线| 99精品视频免费| 91久久精品国产91性色| 欧美亚洲一级| 亚洲午夜久久久久久尤物 | 日韩一级大片| 亚洲国产色一区| 欧美一级黄色网| 亚洲一区视频在线| 欧美激情精品久久久久久蜜臀| 久久爱www久久做| 欧美日韩国产综合视频在线观看中文| 久久久精品国产99久久精品芒果| 欧美精品三级日韩久久| 欧美v日韩v国产v| 国产日韩欧美精品一区| 一区二区免费看| 99精品久久久| 欧美夫妇交换俱乐部在线观看| 久久国产免费看| 国产精品久久久久久久久久直播| 一区二区视频在线观看| 午夜精品剧场| 在线观看视频免费一区二区三区| 亚洲综合成人婷婷小说| 亚洲欧美福利一区二区| 欧美色欧美亚洲高清在线视频| 亚洲国产精品t66y| 最新成人av在线| 蜜桃av噜噜一区二区三区| 久热精品在线视频| 黑人巨大精品欧美一区二区| 午夜欧美大尺度福利影院在线看| 亚洲一二三区在线| 欧美理论电影在线播放| 亚洲国产影院| 国产精品igao视频网网址不卡日韩| 亚洲经典在线看| 日韩视频―中文字幕| 欧美激情a∨在线视频播放| 欧美黄色视屏| 日韩视频一区二区三区在线播放| 欧美激情一区二区三区成人| 亚洲精品在线二区| 亚洲男人第一网站| 国产亚洲综合精品| 久久婷婷国产麻豆91天堂| 欧美电影免费观看高清完整版| 亚洲国产精品高清久久久| 欧美+亚洲+精品+三区| 亚洲国产另类久久精品| 中文国产亚洲喷潮| 国产精品一区毛片| 老牛嫩草一区二区三区日本| 国产乱码精品1区2区3区| 亚洲激情啪啪| 亚洲欧美日韩人成在线播放| 国产一区二区福利| 欧美风情在线观看| 亚洲午夜av在线| 久久久精品一品道一区| 亚洲电影免费观看高清完整版在线| 美女日韩在线中文字幕| 亚洲精品在线一区二区| 在线看片欧美| 欧美日韩在线视频一区二区| 午夜精品一区二区三区在线播放| 另类天堂av| 欧美亚洲日本一区| 亚洲国产美女| 国产日韩欧美一区在线 | 国产精品高潮呻吟久久| 久久久国产精品亚洲一区| 亚洲第一精品夜夜躁人人爽| 亚洲一区中文| 樱桃成人精品视频在线播放| 欧美日韩国产成人在线| 欧美一区二区在线播放| 亚洲人久久久| 久久精精品视频| 一本不卡影院| 怡红院av一区二区三区| 国产精品hd| 欧美成人四级电影| 久久疯狂做爰流白浆xx| 一区二区三区高清不卡| 欧美激情精品久久久久久大尺度| 亚洲欧美国产日韩天堂区| 亚洲国产精品一区二区www在线| 欧美天天综合网| 欧美成人精品1314www| 欧美综合国产精品久久丁香| 亚洲精品少妇网址| 欧美国产一区二区| 久久精品99无色码中文字幕| 一区二区三区精密机械公司 | 欧美成人一区二区三区在线观看 | 欧美日韩精品久久久| 久久人人爽人人爽爽久久| 亚洲一级黄色| 亚洲精品国产品国语在线app| 久久久久综合一区二区三区| 在线亚洲观看| 亚洲国语精品自产拍在线观看| 午夜欧美大尺度福利影院在线看| 亚洲福利在线看| 国产日韩在线亚洲字幕中文| 欧美日韩精品免费在线观看视频| 久久久青草青青国产亚洲免观| 一本大道av伊人久久综合| 亚洲黄色一区| 欧美成人性网| 久久综合影音| 欧美国产精品一区| 免费欧美电影| 免费视频一区| 久久婷婷人人澡人人喊人人爽| 久久精品一区二区国产| 午夜一区在线| 久久精品国产一区二区三| 国产日韩欧美在线播放| 性欧美超级视频| 久久www成人_看片免费不卡| 欧美中文字幕在线播放| 午夜国产精品视频免费体验区| 日韩一二三在线视频播| 国产精品免费视频xxxx| 国产精品一区二区视频| 国产精品高潮粉嫩av| 欧美日韩伦理在线免费| 久久综合狠狠|