版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Delphi中獲取打印機(jī)設(shè)備名和端口名uses Printers;$IFNDEF WIN32const MAX_PATH = 144;$ENDIFprocedure TForm1.Button1Click(Sender: TObject);varpDevice : pChar;pDriver : pChar;pPort : pChar;hDMode : THandle;beginif PrintDialog1.Execute then beginGetMem(pDevice, cchDeviceName);GetMem(pDriver, MAX_PATH);GetMem(pPort, MAX_
2、PATH);Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);if lStrLen(pDriver) = 0 then beginGetProfileString('Devices', pDevice, '', pDriver, MAX_PATH);pDriverpos(',', pDriver) - 1 := #0;end;if lStrLen(pPort) = 0 then beginGetProfileString('Devices', pDevice, '
3、9;, pPort, MAX_PATH);lStrCpy(pPort, pPortlStrLen(pPort)+2);end;Memo1.Lines.Add('Device := ' + StrPas(pDevice);Memo1.Lines.Add('Driver := ' + StrPas(pDriver);Memo1.Lines.Add('Port := ' + StrPas(pPort);FreeMem(pDevice, cchDeviceName);FreeMem(pDriver, MAX_PATH);FreeMem(pPort, MA
4、X_PATH);end;end;Api函數(shù)列表 -與打印相關(guān) Api函數(shù)名 函數(shù)說(shuō)明 適用范圍 W3.x W95 NTAddPrinterConnection 為當(dāng)前用戶建立與打印機(jī)的聯(lián)系 否 是 是StartPagePrinter 開始打印機(jī) 否 是 是StartDoc 開始打印作業(yè) 是 是 是StartDocPrinter 開始打印作業(yè) 否 是 是AddPrintProvidor 加入一個(gè)打印機(jī)支持器 否 是 是AddForm 加入一個(gè)打印機(jī)窗體 否 是 是AddPort 加入一個(gè)打印機(jī)端口 否 是 是AddMonitor 加入一個(gè)打印機(jī)管理器 否 是 是ShellExecute 打開或打
5、印指定文件 否 是 是ClosePrinter 關(guān)閉打開的打印機(jī) 否 是 是WritePrinter 向打印機(jī)輸出數(shù)據(jù) 否 是 是AddPrinter 在打印機(jī)服務(wù)器上建立一個(gè)打印機(jī) 否 是 是SetAbortProc 設(shè)備打印作業(yè)的放棄函數(shù) 否 是 是SetPrinter 設(shè)置打印機(jī)信息 否 是 是SetPrinterData 設(shè)置打印機(jī)配置 否 是 是SetJob 設(shè)置打印作業(yè)信息 否 是 是ResetPrinter 設(shè)置打印數(shù)據(jù)類型和設(shè)備模式值 否 是 是DeletePrinterConnection 刪除與打印機(jī)的連接 否 是 是DeletePrintProcessor 刪除打印機(jī)處理
6、器 否 是 是DeletePrinterDriver 刪除打印機(jī)驅(qū)動(dòng)程序 否 是 是DeletePrinter 刪除打印機(jī)服務(wù)器上的打印機(jī) 否 是 是DeleteMonitor 刪除打印機(jī)監(jiān)視器 否 是 是DeletePrintProvidor 刪除打印機(jī)提供者 否 是 是DeleteForm 刪除打印機(jī)窗體層差 否 是 是AbortPrinter 刪除打印機(jī)緩沖文件 否 是 是DeletePort 刪除打印機(jī)端口 否 是 是AddJob 啟動(dòng)一個(gè)打印作業(yè) 否 是 是AdvancedDocumentProperties 進(jìn)行打印機(jī)高級(jí)設(shè)置 否 是 是PrintDlg 建立打印文本對(duì)話框 否 是
7、 是EnumPrintProcessors 枚舉已安裝的打印機(jī)處理器 否 是 是EnumPrinterDrivers 枚舉已安裝的打印機(jī)驅(qū)動(dòng)程序 否 是 是EnumPorts 枚舉可用打印機(jī)端口 否 是 是EnumPrintProcessorDatatypes 枚舉打印機(jī)所支持的數(shù)據(jù)類型 否 是 是EnumForms 枚舉所支持的打印機(jī)窗體 否 是 是AbortDoc 終止一項(xiàng)打印作業(yè) 是 是 是PrinterProperties 修改打印機(jī)屬性 否 是 是AddPrintProcessor 將打印處理器復(fù)制到打印機(jī)服務(wù)器中 否 是 是AddPrinterDriver 將打印機(jī)驅(qū)動(dòng)程序復(fù)制到打
8、印機(jī)服務(wù)器中 否 是 是PrinterMessageBox 顯示打印作業(yè)出錯(cuò)信息 否 是 是ConnectToPrinterDlg 顯示瀏覽對(duì)話并連接網(wǎng)絡(luò)打印機(jī) 否 是 是EndPagePrinter 結(jié)束打印頁(yè) 否 是 是EndDoc 結(jié)束打印作業(yè) 是 是 是EndDocPrinter 結(jié)束打印作業(yè) 否 是 是StartPage 準(zhǔn)備打印機(jī)接收數(shù)據(jù) 是 是 是WaitForPrinterChange 監(jiān)測(cè)打印機(jī)或打印機(jī)服務(wù)器變化 否 是 是GetPrintProcessorDirectory 獲取打印機(jī)驅(qū)動(dòng)處理器路徑 否 是 是GetPrinterDriver 獲取打印機(jī)驅(qū)動(dòng)程序信息 否 是
9、 是GetPrinterDriverDirectory 獲取打印機(jī)驅(qū)動(dòng)程序路徑 否 是 是GetPrinter 獲取打印機(jī)信息 否 是 是GetPrinterData 獲取打印機(jī)配置信息 否 是 是GetForm 獲取打印機(jī)窗口信息 否 是 是EnumJobs 獲取打印作業(yè)信息 否 是 是GetJob 獲取打印作業(yè)信息 否 是 是OpenPrinter 獲取指定打印機(jī)的句柄 否 是 是ReadPrinter 讀打印機(jī)數(shù)據(jù) 否 是 是DocumentProperties 配置打印機(jī)設(shè)置 否 是 是ConfigurePort 配置打印機(jī)端口 否 是 是用Delphi編寫打印程序的竅門如果你想自己用
10、Delphi編寫一個(gè)打印程序,那么,下面這些技巧或許對(duì)你有所幫助。1.獲娶顯示當(dāng)前打印機(jī)的分辨率Windows下的打印分辨對(duì)打印程序有著至關(guān)重要的作用,如果你想知道打印機(jī)的分辨率,請(qǐng)?jiān)诔绦蛑屑尤胍恍校篠howMessage(水平分辨率 inttostr(GetDeviceCaps(printer Handle,LOGPIXELSX)chr(13)垂直分辨率:inttostr(GetDeviceCaps(printer Handle,LOGPIXELSY);結(jié)果就一目了然了。2.將結(jié)果直接送到打印機(jī)Delphi提供了兩種打印方式:一是將結(jié)果輸送到Form,再調(diào)用Form的print方法將結(jié)果輸送
11、到打印機(jī),二是將結(jié)果直接輸送到打印機(jī)。如果你采 用第一種方式,則無(wú)論你怎樣調(diào)整Form的PrintScal屬性,打印出來(lái)的東西也不會(huì)讓你滿意。因此建議采用第二種方式。3.盡量不要使用AssignPrn盡管AssignPrn簡(jiǎn)化了文本打印操作,使輸出到打印機(jī)像輸出到文件一樣簡(jiǎn)單。但簡(jiǎn)單帶來(lái)的是一系列的不方便:你無(wú)法知道當(dāng)前打印的行數(shù),無(wú)法準(zhǔn)確控制行距,無(wú)法靈活改變字體字形等等。還是用打印機(jī)的Canvas屬性進(jìn)行打印吧。4.用打印機(jī)的點(diǎn)數(shù)做度量單位如果想讓打印程序在任何打印機(jī)上都能正常地打印,你就必須改變你的度量單位。如果采用固定的度量,不同分辨率的打印效果是不同的。舉例來(lái) 講:printer C
12、anvas rectangle(0,0,360,720)在360×360的佳能4200SP上能打出一個(gè)1英寸寬、2英寸高的矩形,但在600×600的惠普6L 上只能打出0 6英寸寬、1 2英寸高的矩形。使用打印機(jī)的點(diǎn)數(shù)做為度量單位是一個(gè)明智的選擇。具體做法如 下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printer Handle,LOGPIXELSX);PointY:=GetDeviceCaps(printer Handle,LOGPIXELSX);printer Canvas rectangle(0,0,PointX
13、1,PointY2)這樣,無(wú)論你使用什么樣的打印機(jī),都能得到一個(gè)1英寸寬、2英寸高的矩形。5.添加打印程序單元盡管Delphi在生成窗體時(shí)會(huì)自動(dòng)在USES部分加入許多程序單元,但打印程序單元(Printers)卻不在之列,要想使打印機(jī)正常工作和程序不出錯(cuò),你還是老老實(shí)實(shí)手工給它加上吧。 以下是來(lái)自Borland公司的完整例子。請(qǐng)注意其中兩條判斷語(yǔ)句,這說(shuō)明有時(shí)候僅僅憑getprinters并不能保證信息的正確,還需要WIN.INI的幫助。 uses printers; $IFNDEF WIN32 const MAX_PATH = 144; ENDIF procedure TForm1.Butt
14、on1Click(Sender : TObject); var pDevice : pChar; pDriver : pChar; pPort : pChar; hDMode : THandle; begin if PrintDialog1.Execute then begin GetMem(pDevice,cchDeviceName); GetMem(pDriver,MAX_PATH); GetMem(pPort,MAX_PATH); Printer.GetPrinter(pDevice,pDriver,pPort,hDMode); if lStrLen(pDriver) = 0 then
15、begin GetProfileString('Devices',pDevice,'',pDriver,MAX_PATH); pDriverpos(',',pDriver) - 1 := #0; end; if lStrLen(pPort) = 0 then begin GetProfileString('Devices',pDevice,'',pPort,MAX_PATH); lStrCpy(pPort,pPortlStrLen(pPort) + 2); end; FreeMem(pDevice,cchDevic
16、eName); FreeMem(pDriver,MAX_PATH); FreeMem(pPort,MAX_PATH); end; end;· 獲取打印機(jī)隊(duì)列的狀態(tài)信息: 在有些情況下,需要獲取打印機(jī)隊(duì)列的狀態(tài)信息,可以通過WindowsAPI函數(shù)ENumJobs來(lái)獲取打印機(jī)隊(duì)列的狀態(tài)信息。 下面的程序片斷對(duì)獲取打印機(jī)隊(duì)列的狀態(tài)信息進(jìn)行了說(shuō)明。 (1)創(chuàng)建一個(gè)新工程; (2)在窗體Form1中添加一個(gè)Button組件和一個(gè)Memo組件,進(jìn)行相關(guān)屬性的設(shè)置; (3)添加Button1的OnClick事件。 procedure TForm1.Button1Click(Sender :TOb
17、ject); var LPHandle : THandle;/打印機(jī)句柄 LPStrBuf : Array 0.256 of Char;/打印機(jī)名稱 NoJobs : Word; /希望獲取的作業(yè)數(shù) s : LongWord; /Job_Info的字節(jié)數(shù) Job_Info : Array 0.10 of JOB_INFO_1; /打印隊(duì)列信息 cbNeeded : Cardinal; cReturned : Cardinal; /返回的作業(yè)數(shù) ret : LongBool; I : integer; begin LPStrBuf := 'HPLaserJet'/指定打印機(jī)名 /
18、打開打印機(jī) if OpenPrinter() then begin MessageBox(Form1.Handle,'打開打印機(jī)失敗。','信息',MB_OK); Exit; end; s := SizeOf(Job_Info); cbNeeded := 0; cReturned := 0; NoJobs := 10; ret := ENumJobs(LPHandle,0,NoJobs,1,Job_Info,s,cbNeeded,cReturn); /顯示打印隊(duì)列信息 Memo1.Lines.Add('共有打印任務(wù):' + InttoStr(cR
19、eturned) + '個(gè)。'); for I := 0 to cReturned -1 do Memo1.Lines.Add('第' + IntToStr(I+1) + '個(gè)打印任務(wù)有' + IntToStr(Job_InfoI.TotalPages) + '頁(yè)。'); end; 在進(jìn)行測(cè)試的時(shí)候,應(yīng)根據(jù)系統(tǒng)中安裝的打印機(jī)設(shè)置LPStrBuf的數(shù)值,可以通過Windows系統(tǒng)的“控制面板”打開打印機(jī)管理器驗(yàn)證運(yùn)行結(jié)果。· 獲取默認(rèn)打印機(jī)的信息: 在Windows的Win.ini文件中有下面的一些配置信息: Window
20、s load = run = NullPort = None device = HPLaserJetIII,HPPCL5MS,LPT1 . 其中Windows節(jié)的device鍵中指明了當(dāng)前系統(tǒng)中默認(rèn)打印機(jī)的信息??梢酝ㄟ^WindowsAPI函數(shù)GetProfileString獲取該信息。函數(shù)GetProfileString的原形如下: DWORDGetProfileString( LPCTSTRlpAppName, /指定節(jié)名的字符串 LPCTSTRlpKeyName, /指定鍵名的字符串 LPCTSTRlpDefault, /沒有找到鍵名時(shí)返回的字符串 LPTSTRlpReturnedStr
21、ing, /在鍵名找到時(shí)返回的字符串 DWORDnSize /lpReturnedString的字節(jié)數(shù) ); 例子如下: (1)創(chuàng)建一個(gè)新的工程; (2)在窗體Form1上添加一個(gè)Button組件和一個(gè)Edit組件,進(jìn)行相關(guān)屬性設(shè)置; (3)添加Button1的OnClick事件。 procedure TForm1.Button1Click(Sender : TObject); var AppName : Array 0.256 of Char; /節(jié)名稱字符串 KeyName : Array 0.256 of Char; /鍵名稱字符串 DefaultString : Array 0.256
22、 of Char; /在鍵名沒找到時(shí)默認(rèn)返回的字串 ReturnedString : Array 0.256 of Char; /在鍵名找到時(shí)返回的字串 begin AppName := 'Windows'/節(jié)名稱 KeyName := 'device' /鍵名稱 GetProfileString(AppName,KeyName,DefaultString,ReturnedString,Sizeof(ReturnedString); Edit1.Text := ReturnedString;/顯示結(jié)果 end; 以上測(cè)試可打開win.ini進(jìn)行對(duì)照。2004-3
23、-3 12:24:52 打印機(jī)的設(shè)置· Windows系統(tǒng)默認(rèn)的打印機(jī)信息存放于Win.INI文件中,只有修改了相應(yīng)的文件內(nèi)容,再通知Windows系統(tǒng)進(jìn)行刷新,才算改變了默認(rèn)的打印機(jī)。 下面是程序片斷: var strINI : Array 0.MAX_PATH of Char; arrWindows : Array 0.46 of Char; begin GetWindowsDirectory(strINI,SizeOf(strINI); StrCat(strINI,'Win.INI'); with TINIFile.Create(strINI) do try /
24、更改WIN.INI文件中的默認(rèn)打印機(jī)設(shè)置 WriteString('Windows','device','HPLaserJet 4 Plus,HPPCL5MS,LPT1'); finally Free; end; StrCopy(arrWindows,'Windows'); SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(arrWindows); /發(fā)消息 end;· 調(diào)用系統(tǒng)的“頁(yè)面設(shè)置”對(duì)話框: 首先要在Uses子句中加入CommDlg單元,參見下例: pro
25、cedure TForm1.Button1Click(Sender : TObject); var s : tagPSD; begin FillChar(s,Sizeof(s),0); s.lStructSize := Sizeof(s); if PageSetupDlg(s) then Showmessage('OK') else Showmessage('Error'); end;· 調(diào)用系統(tǒng)的“添加打印機(jī)”對(duì)話框: ShellExecute(0,'Open','rundll','shell32.dll,SH
26、HelpShortcuts_RunDLL AddPrinter', '' , SW_SHOWNORMAL);打印測(cè)試頁(yè): WinExec('rundll32 msprint2.dll,RUNDLL_PrintTestPage',1);· 用代碼添加打印機(jī): 需要調(diào)用API函數(shù)的AddPrinter,它有三個(gè)參數(shù):打印機(jī)名、打印質(zhì)量、打印機(jī)說(shuō)明。 以下代碼把函數(shù)封裝起來(lái)。只需要提供出現(xiàn)在Windows中的打印機(jī)名,打印機(jī)的接口名(例如:LPT1:),驅(qū)動(dòng)器名和打印程序名(通常是winprint)。代碼調(diào)用了API函數(shù)。 unit unit_Add
27、Printer; interface function AddAPrinter(PrinterName,PortName,DriverName,PrintProcessor : string) : boolean; implementation uses SysUtil,WinSpool,Windows;function AddAPrinter(PrinterName,PortName,DriverName,PrintProcessor : string) : boolean; var pName : PChar; Level : DWORD; pPrinter : PPrinterInfo2
28、; begin pName := Nil; Level := 2; New(pPrinter); pPrinter.pServerName := nil; pPrinter.pShareName := nil; pPrinter.pComment := nil; pPrinter.pLocation := nil; pPrinter.pDevMode := nil; pPrinter.pSepFile := nil; pPrinter.pDatatype := nil; pPrinter.pParameter := nil; pPrinter.pSecurityDescriptor := ni
29、l; pPrinter.Attributes := 0; pPrinter.Priority := 0; pPrinter.DefaultPriority := 0; pPrinter.StartTime := 0; pPrinter.UntilTime := 0; pPrinter.Status := 0; pPrinter.cJobs := 0; pPrinter.AveragePPM := 0; pPrinter.pPrinterName := PChar(PrinterName); pPrinter.pPortName := PChar(PortName); pPrinter.pDriverName := PChar(Dr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年生態(tài)環(huán)境治理保護(hù)合同
- 2024年版項(xiàng)目監(jiān)工聘用合同
- 特崗英語(yǔ)課程設(shè)計(jì)
- 現(xiàn)代詩(shī)課程設(shè)計(jì)分享
- 電子表課程設(shè)計(jì)c語(yǔ)言
- 測(cè)繪工程課程設(shè)計(jì)選題
- 社交軟件銷售工作總結(jié)
- 航空航天顧問工作總結(jié)
- 保健品行業(yè)營(yíng)銷策略總結(jié)
- 餐飲團(tuán)購(gòu)前臺(tái)工作總結(jié)
- 期末復(fù)(知識(shí)清單)2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 45001-2020職業(yè)健康安全管理體系危險(xiǎn)源識(shí)別與風(fēng)險(xiǎn)評(píng)價(jià)及應(yīng)對(duì)措施表(各部門)
- 人教版六年級(jí)科學(xué)重點(diǎn)知識(shí)點(diǎn)
- 春節(jié):藝術(shù)的盛宴
- 煙草公司化肥采購(gòu)項(xiàng)目-化肥投標(biāo)文件(技術(shù)方案)
- 【良品鋪?zhàn)映杀究刂浦写嬖诘膯栴}及優(yōu)化建議探析(定量論文)11000字】
- 2023八年級(jí)語(yǔ)文上冊(cè) 第三單元 13 唐詩(shī)五首說(shuō)課稿 新人教版
- 2024至2030年中國(guó)青年旅舍行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略研究報(bào)告
- 牙膏采購(gòu)?fù)稑?biāo)合同范本
- 雷軍2024演講破釜沉舟
- 小學(xué)語(yǔ)文(修改病句)專題復(fù)習(xí)課件
評(píng)論
0/150
提交評(píng)論