この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
●プレビュー処理
フォームが表示されようとしているときの処理やフォームのサイズが変更されたときの処理,スクロールの処理など,基本的な処理を実装したところで,いよいよプレビュー処理を実装してゆく。
プレビュー処理では,PrintメソッドやLineメソッドを使い,指定位置に文字を描画したり,罫線を引いたりといった低レベルな処理が中心となってくる。
○DrawPreviewプロシージャの作成まずは,プレビュー画面を表示するDrawPreviewプロシージャから実装する。DrawPreviewプロシージャは,List 7-38の70行目から呼び出されるものである。DrawPreviewプロシージャは次の書式のプロシージャとして作成する。
Private Function DrawPreview(ByRef objPic As Object, _
ByRef StartPage As Long, _
ByRef EndPage As Long) As Long
' プレビュー画面を描画する
' 【引数】
' objDoc = 描画対象となるオブジェクト
ピクチャボックスかPrinterオブジェクトのいずれか
' StartPage = 先頭ページ番号
' EndPage = 最終ページ番号
' 【戻り値】
' -1 = エラー
' 正の数 = 出力した最終ページ番号
End Function
まず,前提条件として,DrawPreviewプロシージャは第1引数に描画対象となるオブジェクトをとり,そこにプレビュー画面を描画することにする。List 7-38の70行目では第1引数にPicDocピクチャボックスを渡しているので,プレビュー画面はPicDocピクチャボックスに描画されることになる。しかし,あとで説明する印刷処理では,第1引数にPrinterオブジェクトを渡す。するとプレビュー画面の出力対象がプリンタとなる。つまり,プレビューではなく,印刷内容が本当にプリンタに出力されるようになる。このように,描画対象を切り替えることで,画面への表示とプリンタへの出力をDrawPreviewプロシージャ1つだけで切り替えられるようにする。
実は,List 7-38でプレビュー画面を表示するPicDocピクチャボックスの大きさをPrinterオブジェクトの大きさ(つまり用紙サイズ)に合わせるように設定したのは,DrawPreviewプロシージャを使って画面にでもプリンタにも出力できるように設計していた,という意味合いもある。もし,PicDocピクチャボックスの大きさとPrinterオブジェクトの用紙の大きさとが違うのであれば,適宜スケーリング(拡大縮小率の設定)するなどの処理が生じ,DrawPreviewプロシージャ内でどちらのオブジェクトにも同じように描画するという手法をとるのが困難になってくる。
本節の冒頭でプレビュー画面の拡大縮小はサポートしないといったのは,スケーリング処理の煩雑さを避けるという意味がある。読者がプレビュー画面の拡大縮小をサポートしたいのであれば,これから説明するDrawPreviewプロシージャの処理内で適宜スケーリングするような処理を施せばよい。具体的には,X座標とY座標に2倍表示であれば2を,4倍表示であれば4を掛けるといった処理をする。ただし,意外と忘れやすいのがフォントの大きさの設定である。フォントの大きさもスケーリングしないと,表示はおかしなものになってしまう。実は,拡大縮小はScaleHeightプロパティとScaleWidthプロパティを設定することで簡単に実現できるのだが(たとえば2倍にするならば,“ScaleHeight = ScaleHeight * 2,ScaleWidth=ScaleWidth * 2”とすればよい),フォントの大きさまではスケーリングされないので,やはり適切な倍率を掛ける処理が不可欠になる。
第2引数と第3引数は出力の先頭ページと終了ページを指定するための引数である。画面への出力である場合(第1引数にPicDocピクチャボックスが渡された場合)には,画面は改ページするわけにはいかないので,複数ページへの出力はせずに,第2引数と第3引数とで同じ値をとり,指定したページを表示することにする。しかし,プリンタへの出力である場合(第1引数にPrinterオブジェクトが渡された場合)には,適宜改ページして,第2引数から第3引数で指定される範囲のページのみを出力(つまり印刷)する。
また,DrawPreviewプロシージャは,戻り値として出力した最終ページ番号を返すよう実装する。実はこの最終ページ番号は,次に説明する最大ページ番号を取得するgetMaxPageプロシージャで用いる予定となっている。この点については,またあとで説明する。
さて,DrawPreviewプロシージャだが,実装したところ,かなり長いプログラムとなってしまった。本来ならば,説明しながら少しずつプログラムを示していくという解説方法をとったほうが理解しやすいと思われるし,これまでもそのようなスタイルを貫いてきた。しかし,DrawPreviewプロシージャの実装を説明しながら示してゆくとなると,説明がどうも冗長になりすぎる。そこで,いままでの解説のしかたとは違い,ここでは先にリストを示し,リスト内でやっていることを順に説明するという解説方法をとることにしたい。
そういうわけで,まずDrawPreviewプロシージャの実装を先に示す。DrawPreviewプロシージャの実装は,List 7-42のようになる。
List 7-42において,DrawPreviewプロシージャは143行目からである。そのまえの部分はDrawPreviewプロシージャから呼び出して利用するプロシージャである。では,DrawPreviewプロシージャの処理を順に説明してゆく。
| 47/134 |
