六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

VC數(shù)據(jù)庫編程中的打印控制

[摘要]VC數(shù)據(jù)庫編程中的打印控制比較復(fù)雜,但它也給程序員最大的靈活性,而這種靈活性正是我們需要的。因?yàn)楦餍袠I(yè)、部門的報(bào)表一般都不太規(guī)整,特別是表頭部分,二、三重嵌套的情況很常見。下面我們就開發(fā)中碰到的一些...
VC數(shù)據(jù)庫編程中的打印控制比較復(fù)雜,但它也給程序員最大的靈活性,而這種靈活性正是我們需要的。因?yàn)楦餍袠I(yè)、部門的報(bào)表一般都不太規(guī)整,特別是表頭部分,二、三重嵌套的情況很常見。下面我們就開發(fā)中碰到的一些問題與同行們探討。

  Document/View框架之外的打印

  熟悉VC的程序員都知道Microsoft 的AppWizard生成的應(yīng)用程序框架中,可以選擇免費(fèi)的打印及打印預(yù)覽功能,但前提是必須選擇Document/View結(jié)構(gòu)。然而我們的數(shù)據(jù)庫應(yīng)用中一般都不需要一個(gè)文檔類來保存文檔,因?yàn)閿?shù)據(jù)庫(源)就是我們的文檔,數(shù)據(jù)一般是在一個(gè)對話框或視中與用戶交互,編輯或修改結(jié)果直接通過數(shù)據(jù)庫引擎寫回?cái)?shù)據(jù)庫中。我們的程序主框架要么是基于對話框的、要么是基于無文檔類的單視(或多視)結(jié)構(gòu),在這種情況下,AppWizard 在打印控制部分并不能給我們?nèi)魏螏椭荒茏约贺?fù)責(zé)完成打印控制。

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

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

  2.開始在該設(shè)備場景中的一次打印作業(yè),實(shí)際打印報(bào)表內(nèi)容,終止打印作業(yè);

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

  在下面的例子中,我們在一個(gè)對話框中讓用戶選擇打印某個(gè)報(bào)表,沒有顯示打印設(shè)置對話框,而是直接取系統(tǒng)缺省打印機(jī)設(shè)置,然后根據(jù)報(bào)表格式設(shè)置紙張大小和打印方向。之所以這樣做是因?yàn)楦餍袠I(yè)、部門的報(bào)表格式一般都是至上而下的統(tǒng)一格式。函數(shù)DoPreparePrintDC()、DoPrint()和DoClearPrintDC()分別對應(yīng)上述的三個(gè)步驟:

  BOOL CMyDialog::DoPreparePrintDC()

  // 準(zhǔn)備打印場景

  {

   #define  FONTSIZE 14

   // 獲取打印機(jī)的設(shè)備屬性

   CPrintDialog dlgPrint( FALSE );

   // 得到當(dāng)前系統(tǒng)缺省打印機(jī)設(shè)置

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

   LPDEVMODE pDM=dlgPrint.GetDevMode();

   if(pDM==NULL) return FALSE;

   ::GlobalUnlock(pDM);

   // 聯(lián)結(jié)打印DC,m—hDC是定義為HDC m—hDC的類成員變量

   m—hDC=dlgPrint.CreatePrinterDC();

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

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

   // 設(shè)置打印標(biāo)志

   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()

  // 實(shí)際打印輸出

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

   // 開始一次打印作業(yè)

   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();

   // 將打印字體選進(jìn)設(shè)備場景

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

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

   ...

   // 終止打印作業(yè)

   m—DC.EndPage();

   m—DC.EndDoc();

   m—DC.SelectObject(pOldFont);

   // 清除打印場景

   DoClearPrintDC();}

  表格問題

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

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

  ...

  #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;

  ...

  還有一點(diǎn)小技巧,輸出文本形式的報(bào)表時(shí),對報(bào)表的橫線只需要輸出其正常高度的二分之一或三分之一,這樣報(bào)表看起來更緊湊美觀。這也是我們在前面建議用CDC::DrawText()進(jìn)行繪制輸出的原因。


主站蜘蛛池模板: 伊人影院在线观看 | 欧美爽爽爽爽爽爽视频 | 欧美性第一页 | 亚洲伊人久久大香线蕉啊 | 手机看片午夜 | 日韩视频 中文字幕 | 天天舔天天射天天干 | 天天摸天天做天天爽 | 日本手机在线视频 | 午夜免费啪在线观看视频网站 | 在线播放侵犯高傲女教师希崎 | 色偷偷91综合久久噜噜 | 日韩成人免费观看 | 亚洲影视大全 | 午夜看片网站 | 中文天堂在线最新2022更新 | 中文字幕成人 | 桃花岛高清在线观看 | 日本三级香港三级人妇99 | 青青草原在线免费观看 | 亚洲国产成a人v在线 | 中文精品久久久久国产不卡 | 色综合色狠狠天天久久婷婷基地 | 日本在线网站 | 日本免费完整版观看 | 青春草视频下载 | 四虎影视国产精品亚洲精品hd | 青青久久久国产线免观 | 亚洲二区在线播放 | 日韩在线黄色 | 青娱极品盛宴国产一区 | 搜索黄色毛片 | 色天使久久综合网天天 | 日韩视频一 | 最近在线观看免费完整视频 | 天天操天天干天天透 | 午夜性影院爽爽爽爽爽爽 | 青青青视频在线 | 色综合久久六月婷婷中文字幕 | 亚洲精品第一国产综合高清 | 伊人小视频 |