Visual C++ 6.0程式設計實現列印功能(轉)
Visual C++ 6.0程式設計實現列印功能(轉)[@more@]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;
}
}
四、小結
上面的例子非常簡單,筆者主要是透過它說明如何實現列印功能,而不是說明如何實現複雜的列印效果,因為它們已經不屬於我們這裡所要討論的範疇了,相信讀者朋友真正掌握了上面實現列印功能的方法後,透過靈活的設定裝置環境的各種物件(如字型物件、畫刷等),一定可以列印出各種滿意的效果來。
一、實現方法
在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;
}
}
四、小結
上面的例子非常簡單,筆者主要是透過它說明如何實現列印功能,而不是說明如何實現複雜的列印效果,因為它們已經不屬於我們這裡所要討論的範疇了,相信讀者朋友真正掌握了上面實現列印功能的方法後,透過靈活的設定裝置環境的各種物件(如字型物件、畫刷等),一定可以列印出各種滿意的效果來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Visual C++實現檔案間批次轉換功能 (轉)C++
- Visual C++ 6.0 編 程 經 驗 (轉)C++
- Visual C++ 6.0的文件/視結構 (轉)C++
- C++程式設計實現C++程式設計
- Visual C++網路程式設計案例實戰pdfC++程式設計
- C++程式設計最佳實踐(轉)C++程式設計
- 實現類似IE的列印網頁功能 (轉)網頁
- 在java中實現對FORM的列印功能 (轉)JavaORM
- 也用 C++ 實現 Property 功能 (轉)C++
- Visual C++程式設計實戰寶典pdf 李琳娜,與光碟C++程式設計
- 基於Microsoft visual c++ 6.0實現客戶端HTTP的Get、Post請求ROSC++客戶端HTTP
- 在Visual C++中用ADO進行資料庫程式設計 (轉)C++資料庫程式設計
- web 實現分頁列印功能Web
- Visual Basic 程式設計標準(1) (轉)程式設計
- Visual C++ ADO資料庫程式設計入門C++資料庫程式設計
- 用Visual C++實現圖象漸顯和漸隱 (轉)C++
- (轉)Linux下 C++呼叫C 實現socket網路通訊程式設計LinuxC++程式設計
- 泛型程式設計在非C++語言中的實現之探討 (轉)泛型程式設計C++
- electron + vue專案實現列印小票功能Vue
- Visual C++ 6.0專案檔案型別簡介C++型別
- 精通Visual C++圖象程式設計------讀書筆記8C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記6.2C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記6.1C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記5C++程式設計筆記
- socket程式設計實現tcp伺服器_C/C++程式設計TCP伺服器C++
- C++ concurrency::task實現非同步程式設計(WindowsC++非同步程式設計Windows
- 實驗1 現代C++程式設計初體驗C++程式設計
- C++的程式設計典範 (轉)C++程式設計
- C++模板超程式設計[metaprogram] (轉)C++程式設計
- C++設計模式:Singleton的模板實現之一 (轉)C++設計模式
- Linux守護程式的程式設計實現(轉)Linux程式設計
- 使用ElasticSearch6.0快速實現全文搜尋功能Elasticsearch
- 關於Visual Basic 6.0類開發(下) (轉)
- 關於Visual Basic 6.0類開發(上) (轉)
- 安卓呼叫PrinterShare實現無線列印功能安卓
- Delphi程式設計:完全控制桌面的實現 (轉)程式設計
- 座標曲線的程式設計實現 (轉)程式設計
- 在VB6.0中實現動態統計報表 (轉)