«Delphi» устраняет проблему пропорций при предварительной печати быстрого отчета.

Быстрый отчет в 1920*1080 разрешение плюс 125% Когда указанная выше среда настройки дисплея,Пропорция «Предварительный просмотр печати» будет неправильной.(слишком большой или слишком маленький),Но фактическая печать нормальная.,Если вы хотите исправить,Необходимо изменить файл qrprntr.pas быстрого отчета в среде компиляции.,Есть два способа исправить это。

 

◎ Местоположение файла
C:\Программные файлы (x86)\EmbarcaderoStudio16.0Quickrep506qrprntr.pas

 

◎ Способ 1
Добавьте функцию ScaleToNativeDeskRes, которая будет вызываться FMetafile.Width и FMetafile.Height.。

procedure TQRPrinter.CreateMetafileCanvas;

  function scaleToNativeDeskRes(pVal: Integer): Integer;
  var
   tTemp: HDC;
  begin
    tTemp := GetDC(0);
    try
      Result := Round((pVal * GetDeviceCaps(tTemp, VERTRES)) / GetDeviceCaps(tTemp, DESKTOPVERTRES));
    finally
      ReleaseDC(0, tTemp);
    end;
  end;

begin
...
  FMetafile.Width := scaleToNativeDeskRes(XSize(PaperWidthValue));
  FMetafile.Height := scaleToNativeDeskRes(YSize(PaperLengthValue));
  FCanvas := TMetafileCanvas.Create(FMetafile, 0);
  FCanvas.Font.PixelsPerInch := MetafileDPI;
...
end;

 

Полный пример выглядит следующим образом

procedure TQRPrinter.CreateMetafileCanvas;

// 解決 Windows 字型放大到 125% 以上時,預覽列印的比例會異常的問題。
 function scaleToNativeDeskRes(pVal: Integer): Integer;
  var
    tTemp: HDC;
  begin
    tTemp := GetDC(0);
    try
      Result := Round((pVal * GetDeviceCaps(tTemp, VERTRES)) / GetDeviceCaps(tTemp, DESKTOPVERTRES));
    finally
      ReleaseDC(0, tTemp);
    end;
  end;

begin
  FMetafile := TMetafile.Create;
  // {$define HIRES}
{$IFDEF HIRES}
  // try a high res canvas
  XFactor := GetDeviceCaps(aPrinter.Handle, LogPixelsX) / 254;
  YFactor := GetDeviceCaps(aPrinter.Handle, LogPixelsY) / 254;
  FMetafile.Width := XSize(PaperWidthValue);
  FMetafile.Height := YSize(PaperLengthValue);
  FCanvas := TMetafileCanvas.Create(FMetafile, aprinter.Handle);
  FCanvas.Font.PixelsPerInch := GetDeviceCaps(aprinter.Handle, LOGPIXELSY);
{$ELSE}
  // dpi fix ? suggested by David Martin
  FMetafile.Width := scaleToNativeDeskRes(XSize(PaperWidthValue)); // add // 在此處調用 scaleToNativeDeskRes。
  FMetafile.Height := scaleToNativeDeskRes(YSize(PaperLengthValue)); // add // 在此處調用 scaleToNativeDeskRes。
  FCanvas := TMetafileCanvas.Create(FMetafile, 0); // add
  FCanvas.Free; // add
  if FMetafile.Width > XSize(PaperWidthValue) then // add
    FMetafile.Inch := (96 * FMetafile.Width) div XSize(PaperWidthValue); // add
  // end fix

  FMetafile.Width := XSize(PaperWidthValue);
  FMetafile.Height := YSize(PaperLengthValue);
  FCanvas := TMetafileCanvas.Create(FMetafile, 0);
  YFactor := Screen.PixelsPerInch / 254;
  XFactor := YFactor;
  SetGraphicsMode(FCanvas.handle, GM_ADVANCED); // disable this line
{$ENDIF}
  // FHyperlinks := TList.Create;
end;

 

◎Метод 2

Фактически, в Кратком отчете 5.06 В версии,Исправление было предоставлено,написать на {$IFDEF нанимает} под,Просто программы там нет {$определить НАЙМ} Определите, что представляет собой высокое разрешение,Так программа не столкнется с программой коррекции。
Поэтому второй метод заключается в {$IFDEF нанимает} Переместите программу в {$ЕЩЕ} под,Просто замените исходное письмо。

procedure TQRPrinter.CreateMetafileCanvas;

begin
  FMetafile := TMetafile.Create;
  // {$define HIRES}
{$IFDEF HIRES}

{$ELSE}
  // try a high res canvas
  // 解決 Windows 字型放大到 125% 以上時,預覽列印的比例會異常的問題。
  XFactor := GetDeviceCaps(aPrinter.Handle, LogPixelsX) / 254;
  YFactor := GetDeviceCaps(aPrinter.Handle, LogPixelsY) / 254;
  FMetafile.Width := XSize(PaperWidthValue);
  FMetafile.Height := YSize(PaperLengthValue);
  FCanvas := TMetafileCanvas.Create(FMetafile, aprinter.Handle);
  FCanvas.Font.PixelsPerInch := GetDeviceCaps(aprinter.Handle, LOGPIXELSY);

  // dpi fix ? suggested by David Martin
  FMetafile.Width := scaleToNativeDeskRes(XSize(PaperWidthValue)); // add
  FMetafile.Height := scaleToNativeDeskRes(YSize(PaperLengthValue)); // add
  FCanvas := TMetafileCanvas.Create(FMetafile, 0); // add
  FCanvas.Free; // add
  if FMetafile.Width > XSize(PaperWidthValue) then // add
    FMetafile.Inch := (96 * FMetafile.Width) div XSize(PaperWidthValue); // add
  // end fix

  FMetafile.Width := XSize(PaperWidthValue);
  FMetafile.Height := YSize(PaperLengthValue);
  FCanvas := TMetafileCanvas.Create(FMetafile, 0);
  YFactor := Screen.PixelsPerInch / 254;
  XFactor := YFactor;
  SetGraphicsMode(FCanvas.handle, GM_ADVANCED); // disable this line
{$ENDIF}
  // FHyperlinks := TList.Create;
end;

 

【參考連結】

Оставить комментарий

Пожалуйста, обратите внимание: Комментарий умеренности включен и может задержать ваш комментарий. Существует нет необходимости повторно свой комментарий.