Printerオブジェクトの文字フォントをPictureボックスへ正確に縮小して表示するには?

解決


マロン  2005-07-11 05:39:07  No: 123389

いつもお世話になっています。
今回は印刷プレビューに関連して、フォントサイズの縮小に
ついてアドバイス頂けないでしょうか。

印刷プレビューに関しては過去ログにもたくさん記事があるよう
なんですが、フォントの縮小に関する突っ込んだ意見がないようなので、
質問させて頂きます。

印刷プレビューを実現する場合、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の扱いは一体、どのようにすれば良いのでしょうか?


3−t  2005-07-11 08:28:48  No: 123390

一行ずつCurrentYの値を制御すれば誤差も小さくなるのでは?


マロン  2005-07-11 16:34:19  No: 123391

3−tさんありがとうございます。
CurrentYでいろいろと実験してみます。


特攻隊長まるるう  2005-07-11 20:36:25  No: 123392

>例えば、具体的に数字をあげると、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


特攻隊長まるるう  2005-07-12 00:50:00  No: 123393

[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=

あと、開発環境を書かなくなっちゃいましたが、回答者にとって全てのスレッドは
別人が書いてるようなものです。そのスレッドのみで質問者の情報が全て伝わるように
全てのスレッドで自分の環境を書いて下さい。


マロン  2005-07-12 01:19:16  No: 123394

[開発環境: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
のサイトによって、フォームに貼り付けている画像の位置や大きさのスケーリングを
する必要があることに気が付きました。

他の部分では特に問題は発見できませんでした。

取り合えず一応の解決は図れたかなと思いますが、ご紹介のサイトをもう少し吟味して、
最終的に解決のチェックを入れたいと思います。


マロン  2005-07-12 16:33:11  No: 123395

特攻隊長まるるうさん、様々な情報のご提供ありがとうございました。
ご紹介のサイトを拝見しました。
今回の件については直接影響がないように思いましたが、フォントに関する
幅広い認識ができたましたので重ねて感謝いたします。
どうもありがとうござました。


マロン  2005-07-12 16:37:35  No: 123396

3−tさん、ヒントを頂きありがとうございました。
無事解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加