程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Visual C++ 6.0編程實現打印功能

Visual C++ 6.0編程實現打印功能

編輯:關於VC++

Visual C++6.0是開發Windows應用程序的強大工具,但是要通過它實現程序的打印功能, 一直是初學者的一個難點,經常有朋友詢問如何在VC中實現打印功能,他們往往感到在MFC提 供的框架內實現這個問題很復雜,不知道如何下手。本例針對這個問題,介紹一種簡單的方 法實現文字串的打印功能,讀者朋友可以在此基礎上稍微改動一下,就可以實現文件、圖像的 打印功能。

一、實現方法

在Windows操作系統下,顯示器、打印機和繪圖儀都 被視為輸出設備,正常情況下,系統默認的輸出設備是顯示器。要使用打印機,首先需要創建 一個指向打印機的設備環境句柄,然後通過該句柄調用相關的繪圖函數把所需的文字和圖形輸 出至打印機上。當打印結束後,刪除這個設備環境句柄即可。

當Windows系統中安裝好 打印機後,系統總是自動設置一個打印機為系統的默認打印機,在Windows的啟動配置文件 Win.ini中的[window]段中列出了帶有關鍵字device的默認打印機。下面是某一機器中 Win.ini中的[Windows]字段的內容:

[windows]
load=
run=
NullPort=None
device=HP LaserJet 4050 (computer000),HPBFDB1,LPT1

 

在上述關鍵字device後的字符串中,包含了系 統中默認打印機的三個重要屬性,它們依次是打印機的設備名HP LaserJet 4050 (computer000),驅動程序名是HPBFDB1,輸出端口為LPT1。

為了操縱系統默認的打印 機,實現程序的打印功能,在程序中可調用API函數GetProfileString()從Win.ini文件中 獲得device這個設備字符串,該函數的原型為:DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize)。函數中lpAppName參數為所要檢索的Win.ini文件中的字段名;lpKeyName為字段中的 關鍵字名;lpDefault為默認的字符串;lpReturnedString為檢索到的字符串,如果該函數沒 有從lpKeyName關鍵字中檢索到相應的字符串,則kpRetrunedString返回默認字符串 lpDefault;nSize為返回字符串的長度。

獲取上述字符串後,再使用strtok()函數 將該字符串進行分解,獲得與打印機相關的三個屬性,作為API函數CreateDC()創建打印機設 備環境句柄的參數,CreateDC()函數如果調用成功,則為默認打印機創建一個設備環境句柄 ,否則返回一個空值(NULL)。該函數的原形為:HDC CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST DEVMODE *lpinitData)。該函數的前三個參數恰好 對應打印機的三個屬性,最後一個參數為初始化打印機驅動程序的數據,一般情況下該參數 設置為NULL就可以了。

在具體打印的過程中,調用int StartDoc( HDC hdc, CONST DOCINFO *lpdi )函數來開始一個打印任務,其中參數lpdi為一個指向DOCINFO結構的指針, 該結構如下:

typedef struct {
 int cbSize; //結構的尺寸大小;
 LPCTSTR lpszDocName; //文檔的名字;
 LPCTSTR lpszOutput; //輸出文檔名, 一般情況下為NULL;
 LPCTSTR lpszDatatype;//用來記錄打印過程的數據類型,一般 情況下為NULL;
 DWORD fwType; //用來支持打印工作的額外信息,一般情況下為 NULL;
} DOCINFO, *LPDOCINFO;

開始一個打印任務後,再調用StartPage (hdcprint)函數讓打印機走紙,通知打印機有文檔將要打印;接下來的工作就是輸出數據了 ,這部分工作對於開發人員來說就象往計算機屏幕上輸出文字、圖像一樣容易,只不過是計 算機根據當前的設備環境句柄自動將數據輸出到打印機罷了。數據打印完後,需要作一些善 後處理工作,使用RestoreDC(hdcprint,-1)函數恢復打印機設備句柄、EndPage(hdcprint)函 數讓打印機停止打印,最後調用EndDoc(hdcprint)函數結束上述的打印作業。

二、編 程步驟

1、啟動Visual C++6.0,新建一個基於對話框的應用程序Test,在程序的對話 框窗體中加入一個按鈕(Button),設置這個Button的屬性:ID=IDC_PRINT,CAPTION="打印 ";

2、使用Class Wizard類向導為該按鈕添加一個鼠標單擊處理函數OnPrint( )

3、修改TestDlg.cpp文件中的OnPrint()函數;

4、添加代碼,編譯運行 程序。

三、程序代碼

////////////////////////////////////////////
void CTestDlg::OnPrint()
{
 char szprinter[80];
 char *szDevice,*szDriver,*szOutput;
 HDC hdcprint; // 定義一個設備環境句柄
 //定義一個打印作業
 static DOCINFO di={sizeof (DOCINFO),"printer",NULL};
 // 得到設備字符串存入數組szprinter中
 GetProfileString ("windows","device",",,,",szprinter,80);
 // 將設備字符串分解
 if(NULL!=(szDevice=strtok(szprinter,",")) &&NULL!=(szDriver=strtok(NULL,","))&&
NULL!= (szOutput=strtok(NULL,",")))
  // 創建一個打印機設備句柄
   if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
  {
    if(StartDoc(hdcprint,&di)>0) //開始執行一個打印作業
   {
    StartPage(hdcprint); //打印機走紙,開始打印
    SaveDC(hdcprint); //保存打印機設備句柄
    // 輸出一行文字
    TextOut (hdcprint,1,1,"熱烈祝賀編程實例出版發行!",16);
    RestoreDC (hdcprint,-1); //恢復打印機設備句柄
    EndPage(hdcprint); //打印機停紙, 停止打印
    EndDoc(hdcprint); //結束一個打印作業
     MessageBox("打印完畢!","提示",MB_ICONINFORMATION);
    }
   // 用API函數DeleteDC銷毀一個打印機設備句柄
   DeleteDC (hdcprint);
  }
  else
  {
   MessageBox("沒有 默認打印機,或者沒有安裝打印機!");
   return;
  }
 }

 

四、小結

上面的例子非常簡單,筆者主要是通過它說明如何實現打印 功能,而不是說明如何實現復雜的打印效果,因為它們已經不屬於我們這裡所要討論的范疇 了,相信讀者朋友真正掌握了上面實現打印功能的方法後,通過靈活的設置設備環境的各種 對象(如字體對象、畫刷等),一定可以打印出各種滿意的效果來。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved