mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 19:19:19 +02:00
improved Printer Setup dialog win32 from Olivier und Salvatore
git-svn-id: trunk@7052 -
This commit is contained in:
parent
434dff3b94
commit
73e0927f4b
@ -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.}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user