中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
在winnt以上版本中对打印机纸张的动态设置方法
作者:未知 时间:2005-07-27 22:00 出处:CSDN 责编:chinaitpower
              摘要:在winnt以上版本中对打印机纸张的动态设置方法


在一些票据打印程序中,常常需要动态调整打印机纸张的设置,而网上能够找到的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.



2005年1月20日8:37:12


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有