GetDeviceCaps(Printer.Handle, HORZRES);
GetDeviceCaps(Printer.Handle, VERTRES);
上記で印刷可能領域をピクセル単位で取得しますと、
A4縦で4720と6776になりました。
そこで、ペイントで横幅を4720、縦幅を6776の
ピットマップを作成し、印刷プレビューを
見てみますと、50ページ程になってしまいました。
紙上のピクセルと画面上のピクセルは何か違うのでしょうか?
getDeviceCaps(printer.handle,LOGPIXELSX);で水平PixelsPerInchがわかります
getDeviceCaps(printer.handle,LOGPIXELSY);で垂直PixelsPerInchがわかります
getDeviceCaps(printer.handle,HORZSIZE);で水平mm数
getDeviceCaps(printer.handle,VERTSIZE);で垂直mm数
これから換算して、A4の用紙なら210mm×297mmですから、換算すれば印刷不可能範囲のサイズが出ます。
画面上のPixelsPerInchとは違っています。
HOtaさん、ありがとうございます。
まだ良く分かってないのですが、画面上の1ピクセルが
紙上の何ピクセルに対応するのかが、上記の情報で計算できますでしょうか?
これがわかれば、ピクセル的に紙と1:1に対応した綺麗な画像を
作成し、印刷できるのではないかと思っているのですが・・・
(この考えも変でしょうか・・・)
printer.handleの部分を画面で使用するコンポーネントのハンドルにすれば、比率を出すことができます。
getDeviceCaps(button1.handle,LOGPIXELSX);
getDeviceCaps(button1.handle,LOGPIXELSY);
などを試してみましたが、返って来る値は0でした・・・
GetDC(0)で画面のデバイスコンテキストハンドルが取得できます。
var
DC: HDC;
dpiX, dpiY: Integer;
begin
DC:= GetDC(0);
try
dpiX:= GetDeviceCaps(DC, LOGPIXELSX);
dpiY:= GetDeviceCaps(DC, LOGPIXELSY);
ShowMessage(Format('幅:%d 高さ:%d (1インチ当り)', [dpiX, dpiY]));
finally
ReleaseDC(0, DC);
end;
end;
Basserさん、ありがとうございます。しかし・・・;;
//解像度
GetDeviceCaps(DC, LOGPIXELSX) = 96
GetDeviceCaps(Printer.Handle, LOGPIXELSX) = 600
//印刷可能領域(単位:ピクセル)
GetDeviceCaps(Printer.Handle, HORZRES) = 4720
となりましたので、印刷可能な画面上のピクセル数は、
4720 / 600 * 96 = 755.2
となると思うのですが、ペイントでギリギリ1ページに印刷できる
画像の大きさを調べたところ、822でした。
この違いはどこから来るのでしょうか?
HORZRES は余白を含んでいません。
その違いでは?
紙の実寸(単位:ピクセル)を以下で取得したところ、
GetDeviceCaps(Printer.Handle, PHYSICALWIDTH);
4960 になり、4960 / 600 * 96 = 793.6
となり、やはり 822 にはなりませんでした。
こういうものなのですかねぇ・・・
すみませんトンチンカンな解答をしていました。
画面解像度が96dpiの場合、822pixelsは約217.5mmなので
ペイントが縮小して印刷しているのではないでしょうか?
確かに7.5mmオーバーしてますね^^;
プリンタ側では拡大縮小印刷の設定にはなっていませんでしたので、
ペイントが何か裏でやっているのですかねぇ・・・
ツイート | ![]() |