您现在的位置:首页 >> 硬件系统 >> 硬件系统 >> 内容

关于Delphi控制并口微型针式打印的问题(2)

时间:2011/9/3 15:19:11 点击:

方法二:利用有关打印的Windows API 函数

  解决问题的思路和第一种方法类似,首先要获取当前打印机的DevMode 结构的指针,然后再对该结构进行修改,从而修改打印机纸张大小。要完成上述功能,就得调用DocumentProperties 函数。利用该函数程序就可以获取并修改与当前打印机相关的DevMode 结构中的成员。DocumentProperties 函数申明如下:

LONG DocumentProperties
(
  HWND    hWnd,
  HANDLE   hPrinter,   
  LPTSTR   pDeviceName, 
  PDEVMODE pDevModeOutput, 
  PDEVMODE pDevModeInput, 
  DWORD   fMode
);
  六个参数中只有pDevModeOutput 是输出变量,其余五个参数必须由程序给出具体值。其中,hWnd 表征当前窗口的句柄值;hPrinter 表示当前打印机的句柄;pDeviceName 是对打印机设备的描述;pDevModeOutput 是指向句柄值为hPrinter 的打印机DevMode 结构的指针;pDevModeInput 是指向一个修改后的DevMode 结构的指针,该结构有待于被句柄值为hPrinter 的打印机接受;fMode 定义了该函数的具体功能,如果取值DM_IN_BUFFER 那么表示打印机接受由参数pDevModeInput 表示的由程序修改了的DevMode 值,如果取值DM_OUT_BUFFER 那么程序可以通过参数pDevModeOutput 来获取打印机的DevMode 值,如果fMode 为零,则函数返回的值表示结构DevMode 所需的字节数。承接上述例子,现在将190 *114 大小的纸张设成A4 纸。再往Form1 上放置按钮Button2,增加OnClick 事件,在Use 子句后面添加WinSpool。代码如下:

Procedure TForm1.Button2Click(Sender: TObject);
var
  PrnHd : THandle;
  PrnInfo : PPrinterInfo1;
  pcbNeeded : DWORD;
  PDevModeBytes : DWORD;
  DevMode: PDeviceMode;
  PrnHdc : HDC;
  DocInfo : PDocInfo;
begin
  OpenPrinter('Epson LQ -1600K',PrnHd,nil);
  // 获得打印机句柄PrnHd
  GetMem(PrnInfo,1024);
  GetPrinter(PrnHd,1,PrnInfo,1024,@pcbNeeded);
  PDevModeBytes:= DocumentProperties
( Handle,PrnHd,prninfo^.
 pDescription,DevMode^,DevMode^,0 );
{ 获取DevMode 结构所需的字节数}
  GetMem(DevMode,PDevModeBytes);
// 给结构DevMode 分配空间
  DocumentProperties( Handle,PrnHd,PrnInfo^.p
 Description,DevMode^,DevMode^,DM_OUT_BUFFER );
// 获取打印机的DevMode 结构
  With DevMode^ do begin
   dmPaperSize := DMPAPER_A4   ;
// 将纸张设置成A4 纸
   dmFields := dmFields or DM_PAPERSIZE;
  end;
  DocumentProperties( Handle,PrnHd,PrnInfo^.p
Description,DevMode^,DevMode^,
DM_OUT_BUFFER or DM_IN_BUFFER);
// 修改DevMode 结构。
 { 下面的代码是为了测试打印机
  是否按A4 纸大小来打印 }
  PrnHdc := CreateDC
( nil, 'Epson LQ -1600K',nil,DevMode );
  GetMem( DocInfo, 100 );
  With DocInfo^ do begin
   cbSize := sizeof(DocInfo);
   lpszDocName := nil;
   lpszOutput := nil;
   lpszDatatype := nil;
   fwType := DI_APPBANDING;
  end;
  StartDoc( PrnHdc, DocInfo^);
  StartPage(PrnHdc);
  TextOut( PrnHdc, 10, 10, 'Hello My Friend!',17);
  EndPage(PrnHdc);
  EndDoc(PrnHdc);
  DeleteDC(PrnHdc);
  FreeMem(DocInfo);
  FreeMem(PrnInfo);
  FreeMem(DevMode);
end;

上一页12下一页

作者:幸福苹果 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号