procedure TForm3.sBitBtn1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
RR: TRect;
PrintersInfo, TmpPrintersInfo: PPrinterInfo1;
pcbNeeded, pcReturned, jpcbNeeded, jpcReturned: DWORD;
I, J: Integer;
papermmx, papermmy: Extended;
x1, y2:Integer;
hPrinter: THandle;
JobInfo, TmpJobInfo: PJobInfo3;
begin
with Printer do
begin
if {sComboBox1.ItemIndex = -1} 1=2then
begin
beep;
ShowMessage('Нет принтеров для печати! Либо ваши принтеры установлены как виртуальные.');
end
else
begin
Printer.PrinterIndex:=sComboBox1.ItemIndex;
Printer.PrinterIndex:=2; //для теста
BeginDoc;
// The StartDoc function starts a print job.
try
papermmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX);
papermmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY);
x1:= Round(papermmx);
y2:= Round(papermmy);
ScaleX := GetDeviceCaps(Handle, logPixelsX) div 1 ; //
ScaleY := GetDeviceCaps(Handle, logPixelsY) div 1 ; //
// Retrieves information about the Pixels per Inch of the Printer.
RR := Rect(0, 0, x1 * ScaleX , y2 * ScaleY);
Canvas.StretchDraw(RR, Image2.Picture.Graphic);
// Stretch to fit
finally
EndDoc;
end;
end;
end;
sleep(5000);
if Printer.Printing = false then
begin
//очистка очереди печати
EnumPrinters(PRINTER_ENUM_LOCAL, nil, 1, PrintersInfo, 0, pcbNeeded, pcReturned);
if GetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
GetMem(PrintersInfo, pcbNeeded);
try
if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 1,
PrintersInfo, pcbNeeded, pcbNeeded, pcReturned) then
begin
TmpPrintersInfo := PrintersInfo;
for I := 0 to pcReturned - 1 do
begin
if OpenPrinter(TmpPrintersInfo^.pName, hPrinter, nil) then
begin
EnumJobs(hPrinter, 0, 100, 1, nil,
0, jpcbNeeded, jpcReturned);
if GetLastError in [NO_ERROR, ERROR_INSUFFICIENT_BUFFER] then
begin
GetMem(JobInfo, jpcbNeeded);
try
if EnumJobs(hPrinter, 0, 100, 3, JobInfo,
jpcbNeeded, jpcbNeeded, jpcReturned) then
begin
TmpJobInfo := JobInfo;
for J := 0 to jpcReturned - 1 do
begin
if not SetJob(hPrinter, TmpJobInfo^.JobId, 0,
nil, JOB_CONTROL_DELETE) then RaiseLastOSError;
Inc(TmpJobInfo);
end;
end
else
RaiseLastOSError;
finally
FreeMem(JobInfo);
end;
end
else
RaiseLastOSError;
end
else
RaiseLastOSError;
Inc(TmpPrintersInfo);
end;
end
else
RaiseLastOSError;
finally
FreeMem(PrintersInfo);
end;
end
else
RaiseLastOSError;
end
else
begin
Showmessage('Печать идет');
end;
end;