日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

VC數據庫編程中的打印控制

VC數據庫編程中的打印控制

更新時間:2022-05-02 文章作者:未知 信息來源:網絡 閱讀次數:

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()進行繪制輸出的原因。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

主站蜘蛛池模板: 台湾精品视频在线观看 | 日韩大片免费观看视频播放 | 最新国产午夜精品视频成人 | 欧美激情一区二区三区中文字幕 | 国产精品成人一区二区 | 国产精品国产色综合色 | 精品国产成人 | 欧美激情一区二区三区中文字幕 | 久久精品免费观看视频 | 第一色区 | 蜜桃精品视频 | 久久精品国产精品亚洲精品 | 国产日韩精品一区在线不卡 | 久久久窝窝午夜精品 | 色综合久久中文色婷婷 | 精品72久久久久久久中文字幕 | 久久久国产精品免费视频 | 日韩一级片免费在线观看 | 亚洲精品国产福利在线观看 | 天天摸天天澡天天碰天天弄 | 天干夜天天夜天干天ww | 亚洲 欧美 日韩在线 | 国产精品合集一区二区 | 欧美国产综合日韩一区二区 | 欧美成人午夜影院 | 美女被免费网站视频在线 | 天天干天天舔天天射 | 2023天天操| 亚洲高清在线不卡中文字幕网 | 欧美亚洲国产成人精品 | 欧美手机手机在线视频一区 | 亚洲一级香蕉视频 | 在线日韩中文字幕 | www视频免费在线观看 | 青青草国产成人久久91网 | 天天澡天天碰天天狠伊人五月 | 欧美一区二区三区大片 | 欧美性生活网站 | 又粗又大又爽 真人一级毛片 | 日本高清视频色www在线观看 | 国产呦萝资源网站 |