c++连接打印机(转载)
Visual C++6.0是開發(fā)Windows應(yīng)用程序的強(qiáng)大工具,但是要通過它實(shí)現(xiàn)程序的打印功能,一直是初學(xué)者的一個(gè)難點(diǎn),經(jīng)常有朋友詢問如何在VC中實(shí)現(xiàn)打印功能,他們往往感到在MFC提供的框架內(nèi)實(shí)現(xiàn)這個(gè)問題很復(fù)雜,不知道如何下手。本例針對(duì)這個(gè)問題,介紹一種簡(jiǎn)單的方法實(shí)現(xiàn)文字串的打印功能,讀者朋友可以在此基礎(chǔ)上稍微改動(dòng)一下,就可以實(shí)現(xiàn)文件、圖像的打印功能。
一、實(shí)現(xiàn)方法
在Windows操作系統(tǒng)下,顯示器、打印機(jī)和繪圖儀都被視為輸出設(shè)備,正常情況下,系統(tǒng)默認(rèn)的輸出設(shè)備是顯示器。要使用打印機(jī),首先需要?jiǎng)?chuàng)建一個(gè)指向打印機(jī)的設(shè)備環(huán)境句柄,然后通過該句柄調(diào)用相關(guān)的繪圖函數(shù)把所需的文字和圖形輸出至打印機(jī)上。當(dāng)打印結(jié)束后,刪除這個(gè)設(shè)備環(huán)境句柄即可。
當(dāng)Windows系統(tǒng)中安裝好打印機(jī)后,系統(tǒng)總是自動(dòng)設(shè)置一個(gè)打印機(jī)為系統(tǒng)的默認(rèn)打印機(jī),在Windows的啟動(dòng)配置文件Win.ini中的[window]段中列出了帶有關(guān)鍵字device的默認(rèn)打印機(jī)。下面是某一機(jī)器中Win.ini中的[Windows]字段的內(nèi)容:
| [windows] load= run= NullPort=None device=HP LaserJet 4050(computer000),HPBFDB1,LPT1 |
在上述關(guān)鍵字device后的字符串中,包含了系統(tǒng)中默認(rèn)打印機(jī)的三個(gè)重要屬性,它們依次是打印機(jī)的設(shè)備名HP LaserJet 4050(computer000),驅(qū)動(dòng)程序名是HPBFDB1,輸出端口為L(zhǎng)PT1。
為了操縱系統(tǒng)默認(rèn)的打印機(jī),實(shí)現(xiàn)程序的打印功能,在程序中可調(diào)用API函數(shù)GetProfileString()從Win.ini文件中獲得device這個(gè)設(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為默認(rèn)的字符串;lpReturnedString為檢索到的字符串,如果該函數(shù)沒有從lpKeyName關(guān)鍵字中檢索到相應(yīng)的字符串,則kpRetrunedString返回默認(rèn)字符串lpDefault;nSize為返回字符串的長(zhǎng)度。
獲取上述字符串后,再使用strtok()函數(shù)將該字符串進(jìn)行分解,獲得與打印機(jī)相關(guān)的三個(gè)屬性,作為API函數(shù)CreateDC()創(chuàng)建打印機(jī)設(shè)備環(huán)境句柄的參數(shù),CreateDC()函數(shù)如果調(diào)用成功,則為默認(rèn)打印機(jī)創(chuàng)建一個(gè)設(shè)備環(huán)境句柄,否則返回一個(gè)空值(NULL)。該函數(shù)的原形為:HDC CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST DEVMODE *lpinitData)。該函數(shù)的前三個(gè)參數(shù)恰好對(duì)應(yīng)打印機(jī)的三個(gè)屬性,最后一個(gè)參數(shù)為初始化打印機(jī)驅(qū)動(dòng)程序的數(shù)據(jù),一般情況下該參數(shù)設(shè)置為NULL就可以了。
在具體打印的過程中,調(diào)用int StartDoc( HDC hdc, CONST DOCINFO *lpdi )函數(shù)來開始一個(gè)打印任務(wù),其中參數(shù)lpdi為一個(gè)指向DOCINFO結(jié)構(gòu)的指針,該結(jié)構(gòu)如下:
| typedef struct { int cbSize; //結(jié)構(gòu)的尺寸大小; LPCTSTR lpszDocName; //文檔的名字; LPCTSTR lpszOutput; //輸出文檔名,一般情況下為NULL; LPCTSTR lpszDatatype;//用來記錄打印過程的數(shù)據(jù)類型,一般情況下為NULL; DWORD fwType; //用來支持打印工作的額外信息,一般情況下為NULL; } DOCINFO, *LPDOCINFO; |
開始一個(gè)打印任務(wù)后,再調(diào)用StartPage(hdcprint)函數(shù)讓打印機(jī)走紙,通知打印機(jī)有文檔將要打印;接下來的工作就是輸出數(shù)據(jù)了,這部分工作對(duì)于開發(fā)人員來說就象往計(jì)算機(jī)屏幕上輸出文字、圖像一樣容易,只不過是計(jì)算機(jī)根據(jù)當(dāng)前的設(shè)備環(huán)境句柄自動(dòng)將數(shù)據(jù)輸出到打印機(jī)罷了。數(shù)據(jù)打印完后,需要作一些善后處理工作,使用RestoreDC(hdcprint,-1)函數(shù)恢復(fù)打印機(jī)設(shè)備句柄、EndPage(hdcprint)函數(shù)讓打印機(jī)停止打印,最后調(diào)用EndDoc(hdcprint)函數(shù)結(jié)束上述的打印作業(yè)。
二、編程步驟
1、啟動(dòng)Visual C++6.0,新建一個(gè)基于對(duì)話框的應(yīng)用程序Test,在程序的對(duì)話框窗體中加入一個(gè)按鈕(Button),設(shè)置這個(gè)Button的屬性:ID=IDC_PRINT,CAPTION="打印";
2、使用Class Wizard類向?qū)樵摪粹o添加一個(gè)鼠標(biāo)單擊處理函數(shù)OnPrint()
3、修改TestDlg.cpp文件中的OnPrint()函數(shù);
4、添加代碼,編譯運(yùn)行程序。
三、程序代碼
| //////////////////////////////////////////// void CTestDlg::OnPrint() { char szprinter[80]; char *szDevice,*szDriver,*szOutput; HDC hdcprint; // 定義一個(gè)設(shè)備環(huán)境句柄 //定義一個(gè)打印作業(yè) static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; // 得到設(shè)備字符串存入數(shù)組szprinter中 GetProfileString("windows","device",",,,",szprinter,80); // 將設(shè)備字符串分解 if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&& NULL!=(szOutput=strtok(NULL,","))) // 創(chuàng)建一個(gè)打印機(jī)設(shè)備句柄 if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0) { if(StartDoc(hdcprint,&di)>0) //開始執(zhí)行一個(gè)打印作業(yè) { StartPage(hdcprint); //打印機(jī)走紙,開始打印 SaveDC(hdcprint); //保存打印機(jī)設(shè)備句柄 // 輸出一行文字 TextOut(hdcprint,1,1,"熱烈祝賀編程實(shí)例出版發(fā)行!",16); RestoreDC(hdcprint,-1); //恢復(fù)打印機(jī)設(shè)備句柄 EndPage(hdcprint); //打印機(jī)停紙,停止打印 EndDoc(hdcprint); //結(jié)束一個(gè)打印作業(yè) MessageBox("打印完畢!","提示",MB_ICONINFORMATION); } // 用API函數(shù)DeleteDC銷毀一個(gè)打印機(jī)設(shè)備句柄 DeleteDC(hdcprint); } else { MessageBox("沒有默認(rèn)打印機(jī),或者沒有安裝打印機(jī)!"); return; } } |
轉(zhuǎn)載:https://blog.csdn.net/rongyong/article/details/46007717
總結(jié)
以上是生活随笔為你收集整理的c++连接打印机(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql hibernate id g
- 下一篇: java pdf中文乱码_java转pd