この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
7.4.7 顧客情報の印刷処理
●印刷プレビューフォームが表示されたときの処理
10〜19行目では,PicDocピクチャボックスに対して,デフォルトプリンタで採用されているものと同じ用紙サイズとフォントを選択するように設定している。
10〜12行目は,PicDocピクチャボックスのサイズを設定している箇所である。デフォルトプリンタの用紙幅はPrinterオブジェクトのWidthプロパティで,用紙高さは同じくHeightプロパティで,それぞれ取得できる。これをPicDocピクチャボックスのWidthプロパティとHeightプロパティに設定すれば,PicDocピクチャボックスの大きさがプリンタの用紙サイズと同じになる。
ただし,10行目にあるように,WidthプロパティとHeightプロパティを設定するまえに,SalceModeプロパティを設定しておく必要がある。ScaleModeプロパティはWidthプロパティやHeightプロパティなど座標を保持するプロパティの単位を保持するプロパティであり,Table 7-14に示すいずれかの値をとる。
Table 7-14 ScaleModeプロパティ
| 値 | 解説 |
|---|---|
| VbUser | ユーザーの独自の単位。ScaleHeight,ScaleWidth,ScaleLeft,ScaleTopといういずれかのプロパティで,独自の単位が設定してあることを示す |
| VbTwips | Twip単位(デフォルト)。論理インチあたり1440twip |
| VbPoints | ポイント単位。論理インチあたり72ポイント |
| VbPixcels | ピクセル単位 |
| VbCharacters | キャラクタ単位。水平:1キャラクタは120twip,垂直:1キャラクタは240twip |
| VbInches | 論理インチ単位 |
| VbMilimeters | 論理ミリメートル単位 |
| VbCentimeters | 論理センチメートル単位 |
| VbHimetric | 論理1/10ミリメートル単位(この単位は設定不可) |
| VbContainerPosition | コントロールの位置を決定するためのコントロールコンテナで使う単位(どの単位かはコントロールコンテナに依存する) |
| VbContainerSize | コントロールのサイズを決定するためにコントロールコンテナで使う単位(どの単位かはコントロールコンテナに依存する) |
一般にVisual Basicでは,ScaleModeプロパティにVbTwipsを指定することが多い。フォームやコントロールなどではデフォルトでScaleModeプロパティがVbTwipsになっている。一方のPrinterオブジェクトのScaleModeプロパティも,通常はVbTwipsになっている。しかし,まれにVbTwipsにならないこともあるので,PrinterオブジェクトのWidthプロパティやHeightプロパティの値を別のコントロールに設定するときには,両者でScaleModeプロパティの値を揃えておく必要がある。もし両者のScaleModeプロパティの値が違うと,設定する大きさも異なるものになってしまう。
ScaleModeプロパティがVbUserであるときには,単位系が,ScaleHeight,ScaleWidth,ScaleLeft,ScaleTopの各プロパティで設定されている。そのため,ScaleModeプロパティを揃えるだけでなく,これら4つのプロパティも同じように揃える必要がある。List 7-38では,PrinterオブジェクトのScaleModeプロパティはVbUserではないということを想定し,その処理を省いている。より汎用的に扱う場合には注意してほしい。
13〜19行目は,PicDocピクチャボックスのフォント指定をPrinterオブジェクトに設定されているものに変更する箇所である。ここでは,Fontオブジェクトの各プロパティをコピーしているという点に注意したい。もし次のようにしたならば,FontオブジェクトのデフォルトプロパティであるNameプロパティの内容,すなわちフォント名だけしか設定されない。
PicDoc.Font = Printer.Font
では,Setステートメントを使って次のようにFontオブジェクトをコピーしてはどうだろうか。
Set PicDoc.Font = Printer.Font
上記のようにSetステートメントを使うと,PicDocピクチャボックスのフォントがPrinterオブジェクトのフォントを指すようになる。しかし,実際には正しく動作しない。具体的にはフォントサイズが正しく設定されないのである。
Fontオブジェクトは,そのデバイスの解像度を考慮したサイズを保持している。PicDocピクチャボックスの描画対象が画面であるのに対し,Printerオブジェクトの描画対象はプリンタである。すなわち,上記のようにSetステートメントを使ってPrinterオブジェクトのFontオブジェクトをPicDocオブジェクトのFontプロパティに設定した場合には,画面解像度のフォントにもかかわらず,プリンタ解像度のフォントが使われてしまうことになる。そのため,フォントサイズが正しく設定されない。よって,ピクチャボックスにプリンタと同じフォントを設定するには,13〜19行目にあるようにFontオブジェクトの各プロパティをそれぞれ分けて設定しなければならないのである。
22行目は,PicDocピクチャボックスを自動的に再描画できるようにするため,AutoRedrawプロパティをTrueに設定している。もしAutoRedrawプロパティをTrueに設定しなければ,ピクチャボックスに描画した内容は再描画のたびに消えてしまう。再描画は,ウィンドウを最小化させたあと復元したときや,別のウィンドウに隠されたあとそのウィンドウが除去されたときなどに発生する。後述の「●プレビュー処理」で説明するが,PicDocピクチャボックスにはプレビュー画面を描画する。そのため,AutoRedrawプロパティがFalseであると,PicDocピクチャボックスが再描画されるたびにプレビュー画面も再描画しなければならず,面倒である。その点,AutoRedrawプロパティをTrueにしておけば,ピクチャボックスに描画した内容は保存され,Visual Basicによって必要に応じて再描画されるので,処理を簡略化できる。
AutoRedrawプロパティをTureに設定した場合,ピクチャボックスに描画した内容を保存するだけのメモリが確保され,描画内容は一時的にメモリに記録される。そして,再描画の必要があった場合には,保存したメモリを読み取ってVisual Basicが再描画する形態となる。つまり,大きなピクチャボックスのAutoRedrawプロパティをTrueにすると,膨大なメモリを消費する結果となる。よって,不必要な場面でAutoRedrawプロパティをTrueにすることは推奨できない。
24行目は,PicDocピクチャボックスの単位をTwip単位(Table 7-14参照)にしている箇所である。これにより,PicDocピクチャボックスの描画単位は,1論理インチあたり1440twipになる。Twip単位以外の単位を指定してもかまわないが,WindowsにおいてはTwip単位を使うと比較的便利である。その理由は,(1)十分な分解能を備えた単位であること,(2)ポイントの単位と相性がよいこと,という2点である。
分解能とは細かさのことであるが,Windowsでは座標の設定に整数値を使う。たとえば,論理インチ単位を使ったときには,1インチ,2インチ,といった整数単位となり,1.3インチや1.5インチといった小数値をとることはできない。一方,Twip単位では,1インチが1440twipであるため,1.3インチ=1440×1.3=1872,1.5インチ=2160,のように正しく表現できる。
また,フォントサイズを指定するときには,一般に単位としてポイントを使う。72ポイント=1インチであり,これは20twipである。つまり,フォントサイズをポイントで指定した場合,それをTwip単位に変換しても小数誤差が生じないというメリットもある。もし論理ミリメートル単位などを用いたとすると,ポイントとミリメートルとのあいだで単位変換するときに小数が発生するため,演算誤差が生まれる。
以上の点から,24行目ではTwip単位とした。
| 43/134 |
