比如打印机现在的预设纸张是A4,现有一程序需要一个用户自定义类型如A2A,那么如何在程序中把打印机预设的A4改成A2A,请大家帮忙,谢谢.
解决方案 »
- delphi sql server 修改列名
- 解析delphi兼容java
- 我想问问有多少人在使用Delphi面对对象编程--给分100
- 关于Ocx,Dll Active 控件的卸载????
- 看看这个!
- 用IntraWeb开发的网站,只开发了1/4就没信心了。请熟悉的同行帮我看看。
- 请大家帮我看一下,有没有能够提高速度的改进方法啊。。???谢谢拉(代码)
- Delphi6的QuickRep的Bands中就没有GroupFooterBand,还是我没装好
- ado远程操作数据库,速度怎么那么慢??????
- readonly?
- 继承窗口上ToolBar,ToolButton的位置问题
- 求最大装箱数量的算法?
Windows,
WinSpool, //一定要 uses 这玩意
SysUtils,
Registry,
Classes;
//=================================
function TForm1.GetDeviceName():String;
var MyReg: TRegistry;
szDeviceName: String;
begin
MyReg := TRegistry.Create;
try
MyReg.RootKey := HKEY_CURRENT_CONFIG;
if MyReg.OpenKey('\System\CurrentControlSet\Control\Print\Printers',False) then
szDeviceName:=MyReg.ReadString('Default')
else
szDeviceName:='';
except
MyReg.Free;
end;
result:=szDeviceName;
end;//===================================
function TForm1.GetPortName(): String;
var MyReg: TRegistry;
szPortName: String;
begin
MyReg := TRegistry.Create;
try
MyReg.RootKey := HKEY_LOCAL_MACHINE;
if MyReg.OpenKey('\System\CurrentControlSet\Control\Print\Printers\'+GetDeviceName(),False) then
szPortName:=MyReg.ReadString('Port')
else
szPortName:='';
Except
MyReg.Free;
end;
result:=szPortName;
end;
//================================
//nOrient 打印方向
//nHandle 打印机的Handle
// 调用 SetPaperSize(2000,3000,1,printer.handle);
// 调用后,修改系统的打印机的纸张大小的设置。
function TForm1.SetPaperSize(var nWidth,nHeight,nOrient:Word;var nHandle: THandle):integer;
var
// szPrinterKey: array[0..99] of Char;
szDeviceName: String;
szPort: String;
// cbBuffer: DWORD;
// dwRV: DWORD;
dwPapers: DWord;
lpwPapers: array[0..255] of Word;
fSupportUserDefind: Boolean;
fSupportA3: Boolean;
fSupportA4: Boolean;
fSupportB5: Boolean;
hDriver: THandle;
hMem: HGLOBAL;
lpDevMode: Pdevicemode;
a1: Pdevicemode;
i: integer;
begin
fSupportUserDefind:=FALSE;
fSupportA3:=FALSE;
fSupportA4:=FALSE;
fSupportB5:=FALSE; //取当前默认打印机设备名
szDeviceName:=GetDeviceName();
if szDeviceName='' then
result:=-1; //取打印机端口
szPort:=GetPortName();
if szPort='' then
result:=-2; //取打印机支持的全部纸型
dwPapers:=DeviceCapabilities(PChar(szDeviceName),PChar(szPort),DC_PAPERS,@lpwPapers,nil);
if (dwPapers<1)or(dwPapers>256) then
result:=-3; //判断打印机是否支持自定义、A3、A4、B5纸型
while (dwPapers > 0) do
begin
case DWORD(lpwPapers[dwPapers]) of
DMPAPER_USER: fSupportUserDefind:=TRUE;
DMPAPER_A3: fSupportA3:=TRUE;
DMPAPER_A4: fSupportA4:=TRUE;
DMPAPER_B5: fSupportB5:=TRUE;
end;
dwPapers:=dwPapers-1;
end; //取打印机的DeviceMode
a1:=nil;
if not(OpenPrinter(PChar(szDeviceName),hDriver,nil)) then result:=-4;
hMem:=GlobalAlloc(GPTR,DocumentPropertiesA(nHandle,hDriver,PChar(szDeviceName),a1^,a1^,0));
lpDevMode:=GlobalLock(hMem);
a1:=nil;
DocumentProperties(nHandle,hDriver,PChar(szDeviceName),lpDevMode^,a1^,DM_OUT_BUFFER); //设置纸型或大小
i:=0;
if ((nWidth=2970)and(nHeight=4200))and(fSupportA3) then i:=1;
if ((nWidth=2100)and(nHeight=2970))and(fSupportA4) then i:=i+2;
if ((nWidth=1820)and(nHeight=2570))and(fSupportB5) then i:=i+3; case i of
1: begin //A3
lpDevMode.dmFields:=DM_PAPERSIZE;
lpDevMode.dmPaperSize:=DMPAPER_A3;
end;
2: begin //A4
lpDevMode.dmFields:=DM_PAPERSIZE;
lpDevMode.dmPaperSize:=DMPAPER_A4;
end;
3: begin //B5
lpDevMode.dmFields:=DM_PAPERSIZE;
lpDevMode.dmPaperSize:=DMPAPER_B5;
end;
else
if fSupportUserDefind then
begin
lpDevMode.dmFields:=DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
lpDevMode.dmPaperSize:=DMPAPER_USER;
lpDevMode.dmPaperWidth:=nWidth;
lpDevMode.dmPaperLength:=nHeight;
end
else
lpDevMode.dmFields:=0;
end; //设置方向
case nOrient of
0: begin
lpDevMode.dmFields:=lpDevMode.dmFields or DM_ORIENTATION;
lpDevMode.dmOrientation:=DMORIENT_PORTRAIT;
end;
1: begin
lpDevMode.dmFields:=lpDevMode.dmFields or DM_ORIENTATION;
lpDevMode.dmOrientation:=DMORIENT_LANDSCAPE;
end;
end; a1:=nil;
DocumentProperties(nHandle,hDriver,PChar(szDeviceName),a1^,lpDevMode^,DM_IN_BUFFER or DM_UPDATE);
GlobalUnlock(hMem);
GlobalFree(hMem);
ClosePrinter(hDriver); result:=1;
end;