DelphiでQuickReportを使用していますが、「ディスプレイの拡大縮小」の設定が100%のPCで作成したQuickReportのプレビュー画面が、設定を他の設定にした(例えば125%)にしているPCでは、小さく表示され、印刷も縮小されます。
解決方法はおそらく、使用するPCの拡大率を取得して、それをQuickReportの設定に反映させるのだと思うのですが、方法がわかりません。
ご存じの方がおられましたら、よろしくお願いします。
ディスプレイの拡大縮小を100%以外にすると
内部のDPI値が変わってそれを使ってるアプリの描画範囲がおかしくなるようです
C++Builder4/QuickReportのA3プレビューでオブジェクトが勝手に縮む
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13188787593
QuickReport側が対応していなかったら自分でスケーリング値を計算する関数を作る必要があるかもしれません
take さん
お返事ありがとうございました。
いろいろ試してみましたが、やはりだめでした。
やはり難しいということなんですね。
ありがとうございました。
QuickReport を使用できる環境ではないので,確かなことは言えません.
もし,プロジェクトを 高 DPI 対応にしていないのであれば,
高 DPI 対応してみるとどうなるか,確認してみたらどうでしょうか.
QuickReport に最新版があれば最新版にするとかでしょうか.
※ 高 DPI 対応でない状態でディスプレイの拡大率を 100% を超える値にすると,
TButton, TMemo などのテキストの文字が少しぼやけた状態になります.
※ 質問の時は環境を書きましょうね ( 20 年以上 ... )
stack overflow に以下のような書き込みがあるのを見つけました.
QRPrntr.pas 内の CreateMetafileCanvas メソッドのコードで
メタファイルの DPI ( PixelsPerInch ) の値を変更する方法です.
参考になるかもしれません.
コードを転載しておきます.
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;
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;
関連すると思われる内容の記事を,私のサイトに掲載しました.
[ 04_高 DPI における画像の描画サイズ調整 - TMetafile 画像 ]
http://mrxray.on.coocan.jp/Delphi/Others/DisplayDPI_Image.htm#04
ツイート | ![]() |