lazarus/components/printers/win32/winprndialogs.inc
2005-12-20 14:31:27 +00:00

298 lines
9.5 KiB
PHP

Uses
Windows,WinUtilPrn, InterfaceBase, Win32Int, LCLIntf,LCLType,WinVer;
{ TPageSetupDialog }
function TPageSetupDialog.Execute: Boolean;
var
lpp : tagPSD;
PDev : TPrinterDevice;
DevMode : PDeviceMode;
DeviceMode : THandle;
DevNames : PDevNames;
St : PChar;
Extra,Size : Integer;
Fields : Dword;
begin
Result:=False;
if not Assigned(Printer) then Exit;
if Printer.Printers.Count>0 then
begin
FillChar(lpp,SizeOf(lpp),0);
with lpp do
begin
lStructSize:=SizeOf(lpp);
hInstance:=LCLType.HInstance;
Flags := PSD_MARGINS;
hWndOwner:=TWin32WidgetSet(WidgetSet).AppHandle;
rtMargin := fMargins;
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
Size := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_SIZE,nil,nil);
Extra := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_EXTRA,nil,nil);
Fields := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_FIELDS,nil,nil);
DeviceMode:=GlobalAlloc(GHND,Size + Extra);
try
DevMode:=PDeviceMode(GlobalLock(DeviceMode));
try
CopyMemory(DevMode,@PDev.DevMode,SizeOf(PDev.DevMode));
DevMode^.dmSize := Word(Size);
DevMode^.dmDriverExtra := Word(Extra);
DevMode^.dmFields := Fields;
finally
GlobalUnLock(DeviceMode);
end;
hDevMode:= DeviceMode;
if PageSetupDlg(lpp) then
begin
St:='';
//Change Selected printer
if lpp.hDevNames<>0 then
begin
DevNames:=PDevNames(GlobalLock(lpp.hDevNames));
try
St:=PChar(DevNames)+DevNames^.wDeviceOffset;
Printer.SetPrinter(St);
finally
GlobalUnlock(lpp.hDevNames);
GlobalFree(lpp.hDevNames);
end;
end;
Result:=True;
if (Flags and PSD_INHUNDREDTHSOFMILLIMETERS)>0 then fUnits := unMM
else
fUnits := unInch;
fMargins := rtMargin;
if lpp.hDevMode<>0 then
begin
DevMode:=PDeviceMode(GlobalLock(lpp.hDevMode));
try
//Set the properties for the selected printer
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
PDev.DevMode.dmPaperSize := DevMode^.dmPaperSize;
finally
GlobalUnlock(lpp.hDevMode);
end;
end;
end;
finally
GlobalFree(DeviceMode);
end;
end;
end;
end;
{ TPrinterSetupDialog }
function TPrinterSetupDialog.Execute: Boolean;
var
lpp : tagPD;
PDev : TPrinterDevice;
DevMode : PDeviceMode;
DeviceMode : THandle;
DevNames : PDevNames;
St : PChar;
Extra,Size : Integer;
Fields : Dword;
begin
Result:=False;
if not Assigned(Printer) then Exit;
if Printer.Printers.Count>0 then
begin
FillChar(lpp,SizeOf(lpp),0);
with lpp do
begin
lStructSize:=SizeOf(lpp);
hInstance:=LCLType.HInstance;
Flags:= PD_PRINTSETUP or PD_RETURNDC;
hWndOwner:=TWin32WidgetSet(WidgetSet).AppHandle;
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
Size := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_SIZE,nil,nil);
Extra := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_EXTRA,nil,nil);
Fields := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_FIELDS,nil,nil);
DeviceMode:=GlobalAlloc(GHND,Size + Extra);
try
DevMode:=PDeviceMode(GlobalLock(DeviceMode));
try
CopyMemory(DevMode,@PDev.DevMode,SizeOf(PDev.DevMode));
DevMode^.dmSize := Word(Size);
DevMode^.dmDriverExtra := Word(Extra);
DevMode^.dmFields := Fields;
finally
GlobalUnLock(DeviceMode);
end;
hDevMode:= DeviceMode;
if PrintDlg(lpp) then
begin
St:='';
//Change Selected printer
if lpp.hDevNames<>0 then
begin
DevNames:=PDevNames(GlobalLock(lpp.hDevNames));
try
St:=PChar(DevNames)+DevNames^.wDeviceOffset;
Printer.SetPrinter(St);
finally
GlobalUnlock(lpp.hDevNames);
GlobalFree(lpp.hDevNames);
end;
end;
Result:=True;
if lpp.hDevMode<>0 then
begin
DevMode:=PDeviceMode(GlobalLock(lpp.hDevMode));
try
//Set the properties for the selected printer
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
PDev.DevMode.dmPaperSize := Devmode^.dmPaperSize;
TWinPrinter(Printer).Handle := hDC;
finally
GlobalUnlock(lpp.hDevMode);
end;
end;
end;
finally
GlobalFree(DeviceMode);
end;
end;
end;
end;
{ TPrintDialog }
function TPrintDialog.Execute: Boolean;
var lpp : tagPD;
PDev : TPrinterDevice;
DevMode : PDeviceMode;
DeviceMode : THandle;
DevNames : PDevNames;
St : PChar;
Extra,Size : Integer;
Fields : Dword;
begin
Result:=False;
if not Assigned(Printer) then Exit;
if Printer.Printers.Count>0 then
begin
FillChar(lpp,SizeOf(lpp),0);
with lpp do
begin
lStructSize:=SizeOf(lpp);
hInstance:=LCLType.HInstance;
Flags := PD_RETURNDC;
if Collate then Flags := Flags or PD_COLLATE;
case PrintRange of
prPageNums : Flags := Flags or PD_PAGENUMS;
prSelection : Flags := Flags or PD_SELECTION;
end;
if PrintToFile then Flags := Flags or PD_PRINTTOFILE;
if not (poPrintToFile in Options) then Flags := Flags or PD_HIDEPRINTTOFILE;
if not (poPageNums in Options) then Flags := Flags or PD_NOPAGENUMS;
if not (poSelection in Options) then Flags := Flags or PD_NOSELECTION;
if (poPrintToFile in Options ) and (poDisablePrintToFile in Options) then Flags := Flags or PD_DISABLEPRINTTOFILE;
if (poHelp in Options) then Flags := Flags or PD_SHOWHELP;
if not (poWarning in Options) then Flags := Flags or PD_NOWARNING;
hWndOwner:=TWin32WidgetSet(WidgetSet).AppHandle;
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
Size := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_SIZE,nil,nil);
Extra := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_EXTRA,nil,nil);
Fields := DeviceCapabilities(PChar(PDev.Name),PChar(PDev.Port),DC_FIELDS,nil,nil);
DeviceMode:=GlobalAlloc(GHND,Size + Extra);
try
DevMode:=PDeviceMode(GlobalLock(DeviceMode));
try
CopyMemory(DevMode,@PDev.DevMode,SizeOf(PDev.DevMode));
DevMode^.dmSize := Word(Size);
DevMode^.dmDriverExtra := Word(Extra);
DevMode^.dmFields := Fields;
finally
GlobalUnLock(DeviceMode);
end;
hDevMode:= DeviceMode;
nCopies:= Word(Copies);
nFromPage := Word(FromPage);
nToPage := Word(ToPage);
nMinPage := Word(MinPage);
nMaxPage := Word(MaxPage);
if PrintDlg(lpp) then
begin
St:='';
//Change Selected printer
if lpp.hDevNames<>0 then
begin
DevNames:=PDevNames(GlobalLock(lpp.hDevNames));
try
St:=PChar(DevNames)+DevNames^.wDeviceOffset;
Printer.SetPrinter(St);
finally
GlobalUnlock(lpp.hDevNames);
GlobalFree(lpp.hDevNames);
end;
end;
Result:=True;
if lpp.hDevMode<>0 then
begin
DevMode:=PDeviceMode(GlobalLock(lpp.hDevMode));
try
//Set the properties for the selected printer
PDev:=TPrinterDevice(Printer.Printers.Objects[Printer.PrinterIndex]);
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
if Printer.PaperSize.SupportedPapers.IndexOfObject(TObject(ptrint(DevMode^.dmPaperSize))) <> -1
then
PDev.DevMode.dmPaperSize := DevMode^.dmPaperSize
else
PDev.DevMode.dmPaperSize := PDev.DefaultPaper;
if nCopies=1 then Copies := DevMode^.dmCopies
else
Copies := nCopies;
Printer.Copies := Copies;
TWinPrinter(Printer).Handle := hDC;
finally
GlobalUnlock(lpp.hDevMode);
end;
end;
PrintRange := prAllPages;
PrintToFile := false;
Collate := false;
if (Flags and PD_SELECTION)>0 then PrintRange := prSelection;
if (Flags and PD_PAGENUMS)>0 then PrintRange := prPageNums;
if (Flags and PD_PRINTTOFILE)>0 then PrintToFile := true;
if (Flags and PD_COLLATE)>0 then Collate := true;
FromPage := Integer(nFromPage);
ToPage := Integer(nToPage);
MinPage := Integer(nMinPage);
MaxPage := Integer(nMaxPage);
end;
finally
GlobalFree(DeviceMode);
end;
end;
end;
end;