• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

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

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

        更新時間:2022-05-02 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

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

          Document/View框架之外的打印

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

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

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

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

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

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

          BOOL CMyDialog::DoPreparePrintDC()

          // 準備打印場景

          {

           #define  FONTSIZE 14

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

           CPrintDialog dlgPrint( FALSE );

           // 得到當前系統(tǒng)缺省打印機設置

           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;

           // 設置打印標志

           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;

           // 開始一次打印作業(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();

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

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

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

           ...

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

           m—DC.EndPage();

           m—DC.EndDoc();

           m—DC.SelectObject(pOldFont);

           // 清除打印場景

           DoClearPrintDC();}

          表格問題

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

          但是,我們在對文本形式的報表進行打印輸出時卻發(fā)現(xiàn)一個有趣的現(xiàn)象,有時輸出結(jié)果的相鄰兩行表格豎線不能對齊,而有時又可以。原來是 Windows 圖形輸出的問題,只要我們在建立打印字體時,字體的高度是偶數(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;

          ...

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

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

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 色婷五月综激情亚洲综合| 伊人久久综在合线亚洲2019| 亚洲色中文字幕在线播放| 中文免费观看视频网站| 亚洲日韩乱码中文无码蜜桃臀| 日本免费一区二区三区 | 久久久久亚洲精品天堂久久久久久| 国产亚洲综合一区二区三区| 国产大片91精品免费观看男同| 亚洲AV成人无码网天堂| 四虎影在线永久免费观看| 美女扒开屁股让男人桶爽免费| 四虎永久免费地址在线网站| 免费高清A级毛片在线播放| 4338×亚洲全国最大色成网站| 中文在线观看永久免费| 亚洲av日韩综合一区在线观看| 免费一级毛片无毒不卡| 91嫩草亚洲精品| 美女黄网站人色视频免费国产| 黄页网站在线免费观看| 中文字幕亚洲无线码a| 免费人成在线观看网站品爱网| 亚洲福利视频一区二区三区| 在线免费观看污网站| 日日躁狠狠躁狠狠爱免费视频| 亚洲精品色午夜无码专区日韩| 一区二区在线免费观看| 亚洲av无码一区二区三区天堂古代 | 中文字幕天天躁日日躁狠狠躁免费| 亚洲国产精品日韩在线| 国产大片51精品免费观看| 久久毛片免费看一区二区三区| 久久亚洲国产成人精品性色| 成人免费a级毛片| 国产免费内射又粗又爽密桃视频| 亚洲最新永久在线观看| 免费一级做a爰片久久毛片潮喷| 久久精品视频免费| 欧洲 亚洲 国产图片综合| 亚洲中文字幕无码爆乳av中文|