VisualC++6.0編程實現(xiàn)打印功能

字號:

Visual C++6.0是開發(fā)Windows應(yīng)用程序的強大工具,但是要通過它實現(xiàn)程序的打印功能,一直是初學(xué)者的一個難點,經(jīng)常有朋友詢問如何在VC中實現(xiàn)打印功能,他們往往感到在MFC提供的框架內(nèi)實現(xiàn)這個問題很復(fù)雜,不知道如何下手。本例針對這個問題,介紹一種簡單的方法實現(xiàn)文字串的打印功能,讀者朋友可以在此基礎(chǔ)上稍微改動一下,就可以實現(xiàn)文件、圖像的打印功能。
    一、實現(xiàn)方法
    在Windows操作系統(tǒng)下,顯示器、打印機和繪圖儀都被視為輸出設(shè)備,正常情況下,系統(tǒng)默認的輸出設(shè)備是顯示器。要使用打印機,首先需要創(chuàng)建一個指向打印機的設(shè)備環(huán)境句柄,然后通過該句柄調(diào)用相關(guān)的繪圖函數(shù)把所需的文字和圖形輸出至打印機上。當(dāng)打印結(jié)束后,刪除這個設(shè)備環(huán)境句柄即可。
    當(dāng)Windows系統(tǒng)中安裝好打印機后,系統(tǒng)總是自動設(shè)置一個打印機為系統(tǒng)的默認打印機,在Windows的啟動配置文件Win.ini中的[window]段中列出了帶有關(guān)鍵字device的默認打印機。下面是某一機器中Win.ini中的[Windows]字段的內(nèi)容:
    [windows]
    load=
    run=
    NullPort=None
    device=HP LaserJet 4050(computer000),HPBFDB1,LPT1
    在上述關(guān)鍵字device后的字符串中,包含了系統(tǒng)中默認打印機的三個重要屬性,它們依次是打印機的設(shè)備名HP LaserJet 4050(computer000),驅(qū)動程序名是HPBFDB1,輸出端口為LPT1。
    為了操縱系統(tǒng)默認的打印機,實現(xiàn)程序的打印功能,在程序中可調(diào)用API函數(shù)GetProfileString()從Win.ini文件中獲得device這個設(shè)備字符串,該函數(shù)的原型為:DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize)。函數(shù)中l(wèi)pAppName參數(shù)為所要檢索的Win.ini文件中的字段名;lpKeyName為字段中的關(guān)鍵字名;lpDefault為默認的字符串;lpReturnedString為檢索到的字符串,如果該函數(shù)沒有從lpKeyName關(guān)鍵字中檢索到相應(yīng)的字符串,則kpRetrunedString返回默認字符串lpDefault;nSize為返回字符串的長度。
    獲取上述字符串后,再使用strtok()函數(shù)將該字符串進行分解,獲得與打印機相關(guān)的三個屬性,作為API函數(shù)CreateDC()創(chuàng)建打印機設(shè)備環(huán)境句柄的參數(shù),CreateDC()函數(shù)如果調(diào)用成功,則為默認打印機創(chuàng)建一個設(shè)備環(huán)境句柄,否則返回一個空值(NULL)。該函數(shù)的原形為:HDC CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST DEVMODE *lpinitData)。該函數(shù)的前三個參數(shù)恰好對應(yīng)打印機的三個屬性,最后一個參數(shù)為初始化打印機驅(qū)動程序的數(shù)據(jù),一般情況下該參數(shù)設(shè)置為NULL就可以了。
    在具體打印的過程中,調(diào)用int StartDoc( HDC hdc, CONST DOCINFO *lpdi )函數(shù)來開始一個打印任務(wù),其中參數(shù)lpdi為一個指向DOCINFO結(jié)構(gòu)的指針,該結(jié)構(gòu)如下:
    typedef struct {
    int cbSize; //結(jié)構(gòu)的尺寸大?。?BR>    LPCTSTR lpszDocName; //文檔的名字;
    LPCTSTR lpszOutput; //輸出文檔名,一般情況下為NULL;
    LPCTSTR lpszDatatype;//用來記錄打印過程的數(shù)據(jù)類型,一般情況下為NULL;
    DWORD fwType; //用來支持打印工作的額外信息,一般情況下為NULL;
    } DOCINFO, *LPDOCINFO;