注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
Win XP中震荡波后应采取的措施
Win 2000防毒从安装系统时开始
Win XP SP2拖放IE窗口可能引发黑
Linux系统下的病毒发展及其分类
用WinRAR解析木马病毒的捆绑原理
识破用WinRAR捆绑的木马
走近 WSH(Windows Scripting Hos
利用Windows控制台删除无法删除的
用Windows自带工具打造“免检”木
从Melissa到Zotob:Windows蠕虫1
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> Delphi >> 文章正文
在winnt以上版本中对打印机纸张的动态设置方法
作者:llhguxing  来源:csdn  点击:  更新:2006-12-19
简介:
在一些票据打印程序中,常常需要动态调整打印机纸张的设置,而网上能够找到的dll只能在98下修改自定义纸张,在nt以上版本中还无相应的dll。所以自己动手通过一些比较笨的办法实现动态修改纸张设置的功能。



library print;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  WinSpool,
  Windows,
  Messages,
  Classes;
var
  hPrinter: THandle;

{$R *.res}
Function GetDefaultPrinterName():PChar; //得到默认的打印机名称
var
  sIniFile, sSection, sKeyName,p,q: PChar;
begin
  sIniFile := 'win.ini';
  sSection := 'windows';
  sKeyName := 'device';
  p:=StrAlloc(80);
  q:=StrAlloc(80);
  GetPrivateProfileString(sSection,sKeyName,nil,p,80,sIniFile); 
  StrLCopy(q,p,(strscan(p,',')-p));
  Result := q;
end;

Function addpage():Boolean; //添加一打印纸张类型名称为300k
var
  FormInfo: TFormInfo1;
  PaperSize: TSize;
  PaperRect: TRect;
begin
  FormInfo.Flags := FORM_USER;
  FormInfo.pName := PChar('300k');
  PaperSize.cx := 100000;
  PaperSize.cy := 100000; //300k纸张的默认大小 1000mm*1000mm
  PaperRect.Left := 1;
  PaperRect.Top := 1;
  PaperRect.Right := 100000;
  PaperRect.Bottom := 100000; //纸张的边距
  FormInfo.Size := PaperSize;
  FormInfo.ImageableArea := PaperRect;
  AddForm(hPrinter, 1, @FormInfo);
  Result := True;
end;

Function changepape():Boolean; //改变当前的打印纸张设置
var
  FormInfos : Array [1..1024] of Form_Info_1;
  cbNeeded, cReturned ,neededsize: DWORD;
  i,j:integer;
  ppo:PRINTER_INFO_2;
  dev :PDeviceMode;
begin
  EnumForms(hPrinter, 1, Nil, 0, cbNeeded, cReturned);
  EnumForms(hPrinter, 1, @FormInfos, cbNeeded, cbNeeded, cReturned );
  j := 0;
  for i:= 1 to cReturned  do 通过轮寻找到300k的纸张的纸张类型排序号
    if FormInfos[i].pName = '300k' then j:=i;
  if j=0 then 
  begin
    addpage();
    j := cReturned + 1;
  end; //如无300k纸张则添加
  GetPrinter(hPrinter,2,Nil, 0, @NeededSize);
  GetPrinter(hPrinter, 2, @ppo, NeededSize, @NeededSize);
  dev := ppo.pDevMode;
  dev.dmPaperSize := j;
  ppo.pDevMode := dev;
  SetPrinter(hPrinter,2,@ppo,0); //定义打印机列表并选择300k纸张
  Result := True;
end;

Function MySetPrtInfo(P:Pchar;W:Integer;L:Integer):Boolean;stdcall;
 //设置打印机的纸张类型为300k,并动态修改300k的大小和边距
var
  FormInfo: TFormInfo1;
  PaperSize: TSize;
  PaperRect: TRect;
begin
  OpenPrinter(GetDefaultPrinterName, hPrinter, nil);
  changepape(); //改变纸张类型定义
  FormInfo.Flags := FORM_USER;
  FormInfo.pName := '300K';
  PaperSize.cx := W*100;
  PaperSize.cy := L*100;
  PaperRect.Left := 0;
  PaperRect.Top := 0;
  PaperRect.Right := W*100;
  PaperRect.Bottom := L*100;
  FormInfo.Size := PaperSize;
  FormInfo.ImageableArea := PaperRect;
  SetForm(hPrinter,'300k',1,@FormInfo); //设置纸张大小
  ClosePrinter(hPrinter);
  Result := True;
end;

exports
  MySetPrtInfo;
begin
end.






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务