我用过的程序,一定可以的;
Win2000下自定义纸张打印的Delphi实现
最近做一个项目升级,在打印方面遇到问题。原系统是使用Powerprn进行页面设置,在Win98下运行正常,但在Win2000下,不能自定义纸张打印。
在Win2000下要自定义纸张,必须在“打印机”的服务器属性中增加(用资源管理器打开“打印机”页面,“文件”菜单中有“服务器属性”)。但总不能让用户自己去增加自定义纸张吧?应该可以通过程序自动进行设置。
包括以下内容:
函数一:设置自定义纸型
{增加规格自定义纸张
PaperName: 自定义纸张名称
PaperWidth: 纸张的宽度,以0.1mm为单位
PaperLength: 纸张的高度,以0.1mm为单位}
procedure AddCustomPaper(const PaperName: string;
PaperWidth, PaperLength:integer);
var
PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
hDMode : THandle;
hPrinter : THandle;
FormInfo : TFormInfo1;
begin
Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
OpenPrinter(PrintDevice, hPrinter, nil);
if hPrinter = 0 then
raise Exception.Create('联接打印机失败!');
with FormInfodo
begin
Flags := FORM_USER;
pName := PChar(PaperName);
Size.cx := PaperWidth*100;
Size.cy := PaperLength*100;
ImageableArea.Left := 0;
ImageableArea.Top := 0;
ImageableArea.Right := PaperWidth*100;
ImageableArea.Bottom := PaperLength*100;
end;
//修改纸型,如果没有就新增
if not SetForm(hPrinter, PChar(PaperName), 1, @FormInfo) then
AddForm(hPrinter, 1, @FormInfo);
ClosePrinter(hPrinter);
end;
函数二:判断操作系统类型,因为对win98和 win2000的devmode设置是不一样的,所以需要先进行判断。
Function OsisNT : boolean;//判断系统是否是NT类型
VAR
GETVER:OSVERSIONINFO;
//声明所需变量,具体内容请参考API函数说明文件。
RET:LONGBOOL;
begin
GETVER.dwOSVersionInfoSize:=148;
RET:=GETVERSIONEX(GETVER);
//调用API函数判断开始
result := GETVER.dwPlatformId=VER_PLATFORM_WIN32_NT;
end;
打印过程:
{首先应确保调用AddCustomPaper以确保有该种纸型
PaperWidth: 纸张的宽度,以0.1mm为单位
PaperLength: 纸张的高度,以0.1mm为单位}
procedure printSomething(PaperWidth, PaperLength:integer);
var
aDevice: array[0..CCHDEVICENAME-1] of Char;
aDriver: array[0..MAX_PATH-1] of Char;
aPort: array[0..31] of Char;
hDevMode: THandle;
pDevMode: PDeviceMode;
begin
// 获取打印机DeviceMode的句柄
Printer.GetPrinter(aDevice, aDriver, aPort, hDevMode);
if hDevMode <> 0 then
begin
// 获取指向DeviceMode的指针
pDevMode := GlobalLock(hDevMode);
if pDevMode <> nil then
begin
pDevMode^.dmPaperSize := DMPAPER_USER;
pDevMode^.dmPaperLength:= paperlength * 100;
pDevMode^.dmPaperWidth := PaperWidth * 100;
if OsisNT then
pDevMode^.dmFormName := 'Your Paper';//改成你的纸张类型名
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE;
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERLENGTH;
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERWIDTH;
if OsisNT then
pDevMode^.dmFields := pDevMode^.dmFields or DM_FORMNAME;
ResetDC(Printer.Handle, pDevMode^);
GlobalUnlock(hDevMode);
end;
end;
with Printerdo
begin
begin
Doc;
{TODO: Print your report}
EndDoc;
end;
end;