QuickReportのプレビュー画面が、PCのディスプレイの拡大縮小の設定によって小さくなります

解決


kazuki  2023-03-31 02:08:04  No: 150911  IP: 192.*.*.*

DelphiでQuickReportを使用していますが、「ディスプレイの拡大縮小」の設定が100%のPCで作成したQuickReportのプレビュー画面が、設定を他の設定にした(例えば125%)にしているPCでは、小さく表示され、印刷も縮小されます。
解決方法はおそらく、使用するPCの拡大率を取得して、それをQuickReportの設定に反映させるのだと思うのですが、方法がわかりません。
ご存じの方がおられましたら、よろしくお願いします。

編集 削除
take  2023-03-31 02:30:15  No: 150913  IP: 192.*.*.*

ディスプレイの拡大縮小を100%以外にすると
内部のDPI値が変わってそれを使ってるアプリの描画範囲がおかしくなるようです

C++Builder4/QuickReportのA3プレビューでオブジェクトが勝手に縮む
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13188787593

QuickReport側が対応していなかったら自分でスケーリング値を計算する関数を作る必要があるかもしれません

編集 削除
kazuki  2023-04-04 06:48:00  No: 150926  IP: 192.*.*.*

take さん
お返事ありがとうございました。
いろいろ試してみましたが、やはりだめでした。
やはり難しいということなんですね。
ありがとうございました。

編集 削除
Mr.XRAY  2023-04-05 21:21:55  No: 150931  IP: 192.*.*.*

QuickReport を使用できる環境ではないので,確かなことは言えません.
もし,プロジェクトを 高 DPI 対応にしていないのであれば,
高 DPI 対応してみるとどうなるか,確認してみたらどうでしょうか.

QuickReport に最新版があれば最新版にするとかでしょうか.

※ 高 DPI 対応でない状態でディスプレイの拡大率を 100% を超える値にすると,
TButton, TMemo などのテキストの文字が少しぼやけた状態になります.

※ 質問の時は環境を書きましょうね ( 20 年以上 ... )

編集 削除
Mr.XRAY  2023-04-06 01:47:53  No: 150932  IP: 192.*.*.*

stack overflow に以下のような書き込みがあるのを見つけました.

QRPrntr.pas 内の CreateMetafileCanvas メソッドのコードで
メタファイルの DPI ( PixelsPerInch ) の値を変更する方法です.
参考になるかもしれません.
コードを転載しておきます.

https://stackoverflow.com/questions/25924614/quick-report-displaying-or-printing-a-report-incorrectly-with-windows-font-size


I found a working solution! Patch for QRPrntr.pas:

  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;



編集 削除
kazuki  2023-04-08 06:50:48  No: 150933  IP: 192.*.*.*

Mr.XRAY さん

お返事、有り難うございます。
教えて頂いた内容で試してみましたが、力不足でうまくいきませんでした。
更に海外情報を探してみたら、基本的には教えて頂いたQRPrntr.pas 内の CreateMetafileCanvas メソッドのコード
を変更する方法なのですが、下記のコードをそのまま使用することで、解決しました。

有り難うございました。今後ともよろしくお願いいたします。

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 := 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}
FMetafile.Width := scaleToNativeDeskRes(XSize(PaperWidthValue));
FMetafile.Height := scaleToNativeDeskRes(YSize(PaperLengthValue));
FCanvas := TMetafileCanvas.Create(FMetafile, 0);
// FCanvas.Font.PixelsPerInch := MetafileDPI;
//***
YFactor := Screen.PixelsPerInch / 254;
XFactor := YFactor;
SetGraphicsMode( FCanvas.handle, GM_ADVANCED);
{$endif}
//FHyperlinks := TList.Create;
end;

編集 削除
Mr.XRAY  2023-04-09 02:08:20  No: 150934  IP: 192.*.*.*

関連すると思われる内容の記事を,私のサイトに掲載しました.

[ 04_高 DPI における画像の描画サイズ調整 - TMetafile 画像 ]
http://mrxray.on.coocan.jp/Delphi/Others/DisplayDPI_Image.htm#04

編集 削除