いつもお世話になっています。
今回は印刷プレビューに関連して、フォントサイズの縮小に
ついてアドバイス頂けないでしょうか。
印刷プレビューに関しては過去ログにもたくさん記事があるよう
なんですが、フォントの縮小に関する突っ込んだ意見がないようなので、
質問させて頂きます。
印刷プレビューを実現する場合、Printerオブジェクトに設定されて
いる情報を、基本的にそのままPictureボックスに描画させることに
なると思います。
ただ問題になるのは、仮にPictureボックスがA4版の縮小した図形
であっても、PrinterオブジェクトのFontSizeをただすんなりと同じ
縮尺で縮小しても、A4の縮小図形に対して同じ比率で縮小されない
という現象が起こらないでしょうか。
例えば、具体的に数字をあげると、PrinterオブジェクトのFontSizeが
10(MS Pゴシックで10.08)だった場合、それを1/3に縮小すると
計算上は3.36なのですが、この値をPictureボックスのFontSizeに代入
すると、自動的に3.75になってしまいます。
たぶんこれが原因なのかなと思うのですが、ページ最後の行と用紙の
下端とのスペースが、実際の印刷結果とプレビュー画面でのそれと
全然違ってきます。
また、設定したFontSizeによっても、Pictureボックスの方で恐らく
数値が自動的に変えられてしまうので、プレビュー画面での見え方が
FontSizeによってまちまちになるのではないかという気がします。
いろいろと試行錯誤したのですが、いい解決策が見つかりません。
FontSizeの扱いは一体、どのようにすれば良いのでしょうか?
一行ずつCurrentYの値を制御すれば誤差も小さくなるのでは?
3−tさんありがとうございます。
CurrentYでいろいろと実験してみます。
>例えば、具体的に数字をあげると、PrinterオブジェクトのFontSizeが
>10(MS Pゴシックで10.08)だった場合、それを1/3に縮小すると
>計算上は3.36なのですが、この値をPictureボックスのFontSizeに代入
>すると、自動的に3.75になってしまいます。
フォントは PictureBox でなくOSの制御かと思いますが…
詳しくないのでリンクだけw…参考になれば。
[レイアウトの基準は文字サイズ]
http://www.h4.dion.ne.jp/~zero1341/win00/102.htm
[高 DPI アプリケーションの記述方法]
http://www.microsoft.com/japan/msdn/windows/windowsxp/highdpiapp.asp
[GetTextMetrics]
http://phys.cool.ne.jp/physjpn/htextmetric.htm
[FontSize プロパティ]([VB6.0]ヘルプより抜粋)
>メモ Visual Basic で使用可能なフォントは、使用しているシステムの設定、
>ディスプレイ、およびプリンタによって異なります。フォントに関連する各プロ
>パティの設定値は、使用可能なフォントがサポートしている値に限られます。
なんかプリンタフォントも関係してるのかも?ってことで
[ぐーぐる検索『プリンタ フォント』]
http://www.google.com/search?hl=ja&biw=947&q=%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF+%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88&lr=
あと、開発環境を書かなくなっちゃいましたが、回答者にとって全てのスレッドは
別人が書いてるようなものです。そのスレッドのみで質問者の情報が全て伝わるように
全てのスレッドで自分の環境を書いて下さい。
[開発環境:WinXP/98,VB6SP6]
特攻隊長まるるう さんありがとうございます。
ご紹介のサイトをちょっと拝見しましたが、
http://www.microsoft.com/japan/msdn/windows/windowsxp/highdpiapp.asp
のサイトは、今回質問の件とは別の部分で大変参考になりました。
このサイトにからんで、もしかしたら別件で質問をさせて頂くかも知れません
ので、その時はよろしくお願いします。
>あと、開発環境を書かなくなっちゃいましたが、回答者にとって全てのスレッドは
>別人が書いてるようなものです。そのスレッドのみで質問者の情報が全て伝わるように
>全てのスレッドで自分の環境を書いて下さい。
失礼しました。今後気を付けます。
さて、まず CurrentY を用いての私の実験結果をご報告します。
PictureBoxに文字を書くために、単に文字列を PictureBox.Print するのでは
なく、1行ごとに CurrentY を設定して文字を描画させてみました。
そのために、下記のコードによってフォントの高さを求めました。
With RichTextBox1
.Text = "〜100行程度の文章〜"
Do
'文書の行数を求めるロジック
' → TextBoxならAPIで行数を簡単に求められる
' ようですが、RichTextBoxなので自前の
' ロジックで求めました。
intTotalRows = intTotalRows + 1
Loop
End With
With Printer
.ScaleMode = vbMillimeters
sglFontHeight = .TextHeight(RichTextBox1.Text) / intTotalRows '方法1
'あるいは
sglFontHeight = .ScaleY(.FontSize, vbPoints, vbMillimeters) '方法2
End With
方法1の場合は全行数を求めておく必要がありますが、どっちみちプレビューでは
ページングの処理でそれが必要となるため、全行数および1ページごとの行数を既に
求めています。
これで求まった sglFontHeight の値を、PictureBox へ1行ずつ描画する度に CurrentY
で座標を直接指定したところ、結果は、単に PictureBox.Print で自動的に描画させる
のに比べ、より実際の印刷結果に近くなりました。
PictureBox での ScaleHeight や ScaleWidth の単位、およびフォントの高さはミリメートル
で処理しているので、相対的な正確さを求める方法としては、フォントがどのような種類
でどのようなサイズであっても、問題なく描画できると思うのですが一般的にどうなんで
しょうか。
ちなみに結果ですが、実際の印刷結果とさほど違いなく描画できました。
また、モニタのDPIを仮に96dpiから120dpiに変更して試してみましたが、プレビューに関しては
特に問題はありませんでした。
余談ですが、ご紹介の
http://www.microsoft.com/japan/msdn/windows/windowsxp/highdpiapp.asp
のサイトによって、フォームに貼り付けている画像の位置や大きさのスケーリングを
する必要があることに気が付きました。
他の部分では特に問題は発見できませんでした。
取り合えず一応の解決は図れたかなと思いますが、ご紹介のサイトをもう少し吟味して、
最終的に解決のチェックを入れたいと思います。
特攻隊長まるるうさん、様々な情報のご提供ありがとうございました。
ご紹介のサイトを拝見しました。
今回の件については直接影響がないように思いましたが、フォントに関する
幅広い認識ができたましたので重ねて感謝いたします。
どうもありがとうござました。
3−tさん、ヒントを頂きありがとうございました。
無事解決しました。
ツイート | ![]() |