improved Printer Setup dialog win32 from Olivier und Salvatore

git-svn-id: trunk@7052 -
This commit is contained in:
mattias 2005-04-03 09:54:56 +00:00
parent 434dff3b94
commit 73e0927f4b
3 changed files with 74 additions and 52 deletions

View File

@ -1,8 +1,7 @@
{************************************************************** {**************************************************************
Implementation for winprinter Implementation for winprinter
***************************************************************} ***************************************************************}
Uses WinUtilPrn, InterfaceBase, Win32Int, LCLIntf;
Uses WinUtilPrn, InterfaceBase, Win32Int;
Const Const
Win32Orientations: array [TPrinterOrientation] of Integer = ( Win32Orientations: array [TPrinterOrientation] of Integer = (
@ -16,7 +15,7 @@ Type
Port : String; Port : String;
DefaultPaper : Short; DefaultPaper : Short;
DevMode: TDeviceMode; DevMode: TDeviceMode;
end; end;
@ -34,36 +33,14 @@ destructor TWinPrinter.Destroy;
begin begin
ClearDC; ClearDC;
DoResetPrintersList; DoResetPrintersList;
if fPrinterHandle<>0 then if fPrinterHandle<>0 then
ClosePrinter(fPrinterHandle); ClosePrinter(fPrinterHandle);
inherited Destroy; inherited Destroy;
end; end;
function TWinPrinter.PrinterSetup: Boolean; function TWinPrinter.BaseDialogs(aFlag : DWORD):boolean;
Var NewDevMode : TDeviceMode;
PDev : TPrinterDevice;
begin
if Printers.Count>0 then
begin
if fPrinterHandle=0 then
SetPrinter(Printers.Strings[PrinterIndex]);
if fPrinterHandle=0 then
raise EPrinter.Create('Printer handle not defined');
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
FillChar(NewDevMode,SizeOf(NewDevMode),0);
Result:=(AdvancedDocumentProperties(0,fPrinterHandle,PChar(PDev.Name),@PDev.DevMode,@NewDevMode)<>0);
if Result then
PDev.DevMode:=NewDevMode;
end;
end;
function TWinPrinter.PrintDialog: Boolean;
var lpp : tagPD; var lpp : tagPD;
PDev : TPrinterDevice; PDev : TPrinterDevice;
DevMode : PDeviceMode; DevMode : PDeviceMode;
@ -72,6 +49,7 @@ var lpp : tagPD;
DevNames : PDevNames; DevNames : PDevNames;
St : PChar; St : PChar;
begin begin
Result:=False;
if Printers.Count>0 then if Printers.Count>0 then
begin begin
FillChar(lpp,SizeOf(lpp),0); FillChar(lpp,SizeOf(lpp),0);
@ -80,7 +58,7 @@ begin
begin begin
lStructSize:=SizeOf(lpp); lStructSize:=SizeOf(lpp);
hInstance:=LCLType.HInstance; hInstance:=LCLType.HInstance;
Flags:=PD_COLLATE or PD_USEDEVMODECOPIES; //PD_PRINTSETUP ; Flags:=aFlag;
hWndOwner:=TWin32WidgetSet(InterfaceObject).AppHandle; hWndOwner:=TWin32WidgetSet(InterfaceObject).AppHandle;
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
@ -92,7 +70,7 @@ begin
finally finally
GlobalUnLock(DeviceMode); GlobalUnLock(DeviceMode);
end; end;
hDevMode:=DeviceMode; hDevMode:=DeviceMode;
nCopies:=1; nCopies:=1;
try try
@ -111,7 +89,9 @@ begin
GlobalFree(lpp.hDevNames); GlobalFree(lpp.hDevNames);
end; end;
end; end;
Result:=True;
if lpp.hDevMode<>0 then if lpp.hDevMode<>0 then
begin begin
DevMode:=PDeviceMode(GlobalLock(lpp.hDevMode)); DevMode:=PDeviceMode(GlobalLock(lpp.hDevMode));
@ -128,7 +108,7 @@ begin
finally finally
if DeviceMode<>0 then if DeviceMode<>0 then
GlobalFree(DeviceMode); GlobalFree(DeviceMode);
if hDevNames<>0 then if hDevNames<>0 then
GlobalFree(hDevNames); GlobalFree(hDevNames);
end; end;
@ -136,6 +116,36 @@ begin
end; end;
end; end;
function TWinPrinter.PrinterSetup: Boolean;
begin
Result:=BaseDialogs(PD_PRINTSETUP);
end;
function TWinPrinter.PrintDialog: Boolean;
begin
Result:=BaseDialogs(PD_COLLATE or PD_USEDEVMODECOPIES);
end;
function TWinPrinter.GetXDPI: Integer;
begin
Result:=72;
if (Printers.Count>0) then
begin
SetDC;
Result:=GetDeviceCaps(fDC, LOGPIXELSX);
end;
end;
function TWinPrinter.GetYDPI: Integer;
begin
Result:=72;
if (Printers.Count>0) then
begin
SetDC;
Result:=GetDeviceCaps(fDC,LOGPIXELSY);
end;
end;
procedure TWinPrinter.SetIC; procedure TWinPrinter.SetIC;
var PDev : TPrinterDevice; var PDev : TPrinterDevice;
begin begin
@ -158,7 +168,7 @@ begin
if (fLastHandleType<>2) and (Printers.Count>0) then if (fLastHandleType<>2) and (Printers.Count>0) then
begin begin
ClearDC; ClearDC;
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
fDC:=CreateDC(PChar(PDev.Driver),PChar(PDev.Device), fDC:=CreateDC(PChar(PDev.Driver),PChar(PDev.Device),
PChar(PDev.Port),@PDev.DevMode); PChar(PDev.Port),@PDev.DevMode);
@ -183,17 +193,19 @@ procedure TWinPrinter.DoBeginDoc;
var Inf: TDocInfo; var Inf: TDocInfo;
begin begin
inherited DoBeginDoc; inherited DoBeginDoc;
if fPrinterHandle=0 then if fPrinterHandle=0 then
raise EPrinter.Create('Printer handle not defined'); raise EPrinter.Create('Printer handle not defined');
ClearDC;
SetDC; SetDC;
Canvas.Handle:=fDC;
Canvas.Refresh; Canvas.Refresh;
FillChar(Inf,SizeOf(Inf),0); FillChar(Inf,SizeOf(Inf),0);
Inf.cbSize:=SizeOf(Inf); Inf.cbSize:=SizeOf(Inf);
Inf.lpszDocName:=PChar(Title); Inf.lpszDocName:=PChar(Title);
StartDoc(fDC,Inf); StartDoc(fDC,Inf);
StartPage(fDC); StartPage(fDC);
end; end;
@ -210,7 +222,7 @@ end;
procedure TWinPrinter.DoEndDoc(aAborded: Boolean); procedure TWinPrinter.DoEndDoc(aAborded: Boolean);
begin begin
inherited DoEndDoc(aAborded); inherited DoEndDoc(aAborded);
EndPage(fDC); EndPage(fDC);
if not aAborded then if not aAborded then
WinUtilPrn.EndDoc(fDC); WinUtilPrn.EndDoc(fDC);
@ -235,7 +247,7 @@ Var Flags : DWORD;
DefaultPrinter : array[0..79] of Char; DefaultPrinter : array[0..79] of Char;
LstStr : TStringList; LstStr : TStringList;
PDev : TPrinterDevice; PDev : TPrinterDevice;
begin begin
Level:=5; //Compatible with all Win32 versions Level:=5; //Compatible with all Win32 versions
DefaultPrinter:=''; DefaultPrinter:='';
@ -294,7 +306,7 @@ begin
PDev.Port :=PPRINTER_INFO_2(InfoPrt)^.pPortName; PDev.Port :=PPRINTER_INFO_2(InfoPrt)^.pPortName;
PDev.DevMode:=PPRINTER_INFO_2(InfoPrt)^.PDevMode^; PDev.DevMode:=PPRINTER_INFO_2(InfoPrt)^.PDevMode^;
PDev.DefaultPaper:=PPRINTER_INFO_2(InfoPrt)^.PDevMode^.dmPaperSize; PDev.DefaultPaper:=PPRINTER_INFO_2(InfoPrt)^.PDevMode^.dmPaperSize;
if AnsiCompareText(PDev.Name,DefaultPrinter)<>0 then if AnsiCompareText(PDev.Name,DefaultPrinter)<>0 then
Lst.AddObject(PDev.Name,PDev) Lst.AddObject(PDev.Name,PDev)
else else
@ -317,7 +329,7 @@ var i : Integer;
Obj : TObject; Obj : TObject;
begin begin
inherited DoResetPrintersList; inherited DoResetPrintersList;
if Printers.Count>0 then if Printers.Count>0 then
begin begin
for i:=0 to Printers.Count-1 do for i:=0 to Printers.Count-1 do
@ -337,7 +349,7 @@ var Buffer : PChar;
ArPapers : Array[0..255] of Word; ArPapers : Array[0..255] of Word;
begin begin
inherited DoEnumPapers(Lst); inherited DoEnumPapers(Lst);
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
@ -347,7 +359,7 @@ begin
if fPrinterHandle=0 then if fPrinterHandle=0 then
raise EPrinter.Create('Printer handle not defined'); raise EPrinter.Create('Printer handle not defined');
//Reteive the supported papers //Reteive the supported papers
PaperC:=0; PaperC:=0;
GetMem(Buffer,64*255); GetMem(Buffer,64*255);
@ -362,7 +374,7 @@ begin
finally finally
FreeMem(Buffer); FreeMem(Buffer);
end; end;
//Retreive the code of papers //Retreive the code of papers
FillChar(ArPapers,SizeOf(ArPapers),0); FillChar(ArPapers,SizeOf(ArPapers),0);
PaperC:=DeviceCapabilities(PChar(Pdev.Name),PCHar(PDev.Port), PaperC:=DeviceCapabilities(PChar(Pdev.Name),PCHar(PDev.Port),
@ -395,11 +407,11 @@ var i : Integer;
j : SHORT; j : SHORT;
begin begin
inherited DoSetPaperName(aName); inherited DoSetPaperName(aName);
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
ClearDC; ClearDC;
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
i:=PaperSize.SupportedPapers.IndexOf(aName); i:=PaperSize.SupportedPapers.IndexOf(aName);
@ -417,7 +429,7 @@ var NSize, i : Integer;
ArSizes : Array[0..255] of TPoint; ArSizes : Array[0..255] of TPoint;
begin begin
Result:=Inherited DoGetPaperRect(aName,aPaperRc); Result:=Inherited DoGetPaperRect(aName,aPaperRc);
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
@ -431,7 +443,7 @@ begin
begin begin
aPaperRc.PhysicalRect:=Classes.Rect(0,0,ArSizes[i].X,ArSizes[i].Y); aPaperRc.PhysicalRect:=Classes.Rect(0,0,ArSizes[i].X,ArSizes[i].Y);
aPaperRc.WorkRect:=Classes.Rect(0,0,ArSizes[i].X,ArSizes[i].Y); aPaperRc.WorkRect:=Classes.Rect(0,0,ArSizes[i].X,ArSizes[i].Y);
Result:=1; Result:=1;
end; end;
end; end;
@ -448,7 +460,7 @@ begin
if i<>-1 then if i<>-1 then
begin begin
ClearDC; ClearDC;
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
if fPrinterHandle<>0 then if fPrinterHandle<>0 then
ClosePrinter(fPrinterHandle); ClosePrinter(fPrinterHandle);
@ -466,7 +478,7 @@ begin
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
if PDev.DevMode.dmCopies<>0 then if PDev.DevMode.dmCopies<>0 then
Result:=PDev.DevMode.dmCopies; Result:=PDev.DevMode.dmCopies;
end; end;
@ -494,7 +506,7 @@ begin
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
Case PDev.DevMode.dmOrientation of Case PDev.DevMode.dmOrientation of
DMORIENT_PORTRAIT : Result:=poPortrait; DMORIENT_PORTRAIT : Result:=poPortrait;
DMORIENT_LANDSCAPE : Result:=poLandscape; DMORIENT_LANDSCAPE : Result:=poLandscape;
@ -506,7 +518,7 @@ procedure TWinPrinter.DoSetOrientation(aValue: TPrinterOrientation);
var PDev : TPrinterDevice; var PDev : TPrinterDevice;
begin begin
inherited DoSetOrientation(aValue); inherited DoSetOrientation(aValue);
if (Printers.Count>0) then if (Printers.Count>0) then
begin begin
PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]); PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
@ -522,3 +534,6 @@ INITIALIZATION
{end.} {end.}

View File

@ -37,6 +37,9 @@ Type
procedure SetIC; procedure SetIC;
procedure SetDC; procedure SetDC;
procedure ClearDC; procedure ClearDC;
function BaseDialogs(aFlag : DWORD):boolean;
protected protected
procedure DoBeginDoc; override; procedure DoBeginDoc; override;
procedure DoNewPage; override; procedure DoNewPage; override;
@ -57,6 +60,9 @@ Type
procedure DoSetCopies(aValue : Integer); override; procedure DoSetCopies(aValue : Integer); override;
function DoGetOrientation: TPrinterOrientation; override; function DoGetOrientation: TPrinterOrientation; override;
procedure DoSetOrientation(aValue : TPrinterOrientation); override; procedure DoSetOrientation(aValue : TPrinterOrientation); override;
function GetXDPI: Integer; override;
function GetYDPI: Integer; override;
public public
constructor Create; override; constructor Create; override;
destructor Destroy; override; destructor Destroy; override;

View File

@ -219,7 +219,7 @@
PRINTER_ERROR_OUTOFPAPER = $00000001; PRINTER_ERROR_OUTOFPAPER = $00000001;
PRINTER_ERROR_JAM = $00000002; PRINTER_ERROR_JAM = $00000002;
PRINTER_ERROR_OUTOFTONER = $00000004; PRINTER_ERROR_OUTOFTONER = $00000004;
//PrintDlg Flags //PrintDlg Flags
PD_ALLPAGES = $00000000; PD_ALLPAGES = $00000000;
PD_SELECTION = $00000001; PD_SELECTION = $00000001;
@ -247,3 +247,4 @@
PD_NONETWORKBUTTON = $00200000; PD_NONETWORKBUTTON = $00200000;