この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
7.4.7 顧客情報の印刷処理
●Win32APIを使ってユーザーにプリンタを選択させる
まずは,DEVMODE構造体から説明する。DEVMODE構造体は,Table 7-19のように定義されている。
Table 7-19 DEVMODE構造体
【定義】
|
【各メンバの意味】
| メンバ | 解説 | |
|---|---|---|
| dmDeviceName | プリンタのデバイス名。PrinterオブジェクトのDeviceNameプロパティに相当する | |
| dmSpecVersion | バージョン番号 | |
| dmDriverVersion | プリンタのデバイスドライバのバージョン | |
| dmSize | この構造体のバイト数。バイト数を求めるにはLen関数を使う | |
| dmDriverExtra | この構造体の後ろに付いているデバイスドライバ固有のデータのバイト数。通常は0を設定する | |
dmFields | この構造体のメンバのうち,有効な値のフラグ。次の定数の組み合わせで指定する。たとえば,DM_ORIENTATIONとDM_PAPERSIZEが指定されていたときには,dmOrientationメンバとdmPaperSizeメンバには有効な値が格納されているということを示す。逆にいうと,それ以外のメンバには有効な値が格納されておらず,無視されているということを示す。各定数の値についてはList 7-53を参照 | |
| 定数 | 有効なメンバ | |
| DM_ORIENTATION | dmOrientation | |
| DM_PAPERSIZE | dmPaperSize | |
| DM_PAPERLENGTH | dmPaperLength | |
| DM_PAPERWIDTH | dmPaperWidth | |
| DM_SCALE | dmScale | |
| DM_COPIES | dmCopies | |
| DM_DEFAULTSOURCE | dmDefaultSource | |
| DM_PRINTQUALITY | dmPrintQuality | |
| DM_COLOR | dmColor | |
| DM_DUPLEX | dmDuplex | |
| DM_YRESOLUTION | dmYResolution | |
| DM_TTOPTION | dmTTOption | |
| DM_COLLATE | dmCollate | |
| DM_FORMNAME | dmFormName | |
| DM_LOGPIXELS | dmLogPixels | |
| DM_BITSPERPEL | dmBitsPerPel | |
| DM_PELSWIDTH | dmPelsWidth | |
| DM_PELSHEIGHT | dmPelsHeight | |
| DM_DISPLAYFLAGS | dmDisplayFlags | |
| DM_DISPLAYFREQUENCY | dmDisplayFrequency | |
| dmOrientation | 用紙の方向。PrinterオブジェクトのOrientationプロパティと同じ | |
| dmPaperSize | 用紙のサイズ。PrinterオブジェクトのPaperSizeプロパティと同じ。ただし,Visual Basicのマニュアルに記載されていない定数が入ることもある(記載されていない値をPrinterオブジェクトのPaperSizeプロパティに指定することもできる)。定数の詳細は,Win32 SDKのドキュメントを参照。dmPaperSizeメンバが0(またはvbPRPSUser定数)のときにはカスタムサイズで,用紙サイズがdmPaperLengthメンバとdmPaperWidthメンバに格納されることを示す | |
| dmPaperLength | 用紙の高さ。dmPaperSizeメンバが0のときのみ有効。PrinterオブジェクトのHeightプロパティと同じ。ただし,dmPaperLengthは1/10ミリメートル単位なので,単位換算の必要がある | |
| dmPaperWidth | 用紙幅。dmPaperSizeメンバが0のときのみ有効。PrinterオブジェクトのWidthプロパティと同じ。ただし,dmPaperWidthは1/10ミリメートル単位なので,単位換算の必要がある | |
| dmScale | 拡大縮小率。百分率のパーセント単位で指定する。たとえば,50を指定すると,50%(半分の大きさ)として印刷される。PrinterオブジェクトのZoomプロパティと同じ | |
| dmCopies | 印刷部数。プリンタのデバイスドライバが対応しているときのみ有効。PrinterオブジェクトのCopiesプロパティと同じ | |
| dmDefaultSource | 給紙トレイを示す番号。PrinterオブジェクトのPaperBinプロパティと同じ | |
| dmPrintQuality | 印字品質(簡易印刷,低品質,高品質などの設定)。PrinterオブジェクトのPrintQualityプロパティと同じ | |
| dmColor | 白黒かカラーかどうかの区別。PrinterオブジェクトのColorModeプロパティと同じ | |
| dmDuplex | 両面印刷の設定。PrinterオブジェクトのDuplexプロパティと同じ | |
| dmYResolution | 縦方向の解像度(DPI) | |
| dmTTOption | TrueTypeフォントの描画方法。ビットマップとして印刷するか,そのまま送信するか,アウトラインをとるか,置換するか,などの設定。設定値についてはWin32 SDKのドキュメントを参照 | |
| dmCollate | 複数部数を印刷するときに部数ごとに並び替えるかどうかの設定 | |
| dmFormName | 用紙の名前。「A4」や「B4」などの名称であり,Windows NTやWindows 2000のみで有効 | |
| dmLogPixels | プリンタの設定では利用されない | |
| dmBitsPerPel | プリンタの設定では利用されない | |
| dmPelsWidth | プリンタの設定では利用されない | |
| dmPelsHeight | プリンタの設定では利用されない | |
| dmDisplayFlags | プリンタの設定では利用されない | |
| dmDisplayFrequency | プリンタの設定では利用されない | |
Table 7-19で示した定義は,Windows 3.1やWindows NT 4.0以前のものである。Windows 95,Windows 98,Windows 2000では,ICM(Image Color Management)によるカラーマッチングの設定項目がさらに後ろに追加されているが,その詳細は割愛する。
[プリンタの設定]ダイアログボックスを表示するときには,その時点のデフォルトプリンタの状態を初期値として表示するのが一般的である。そこで,あらかじめその時点のプリンタの設定をDEVMODE構造体に格納し,それをさらにPRINTDLG構造体に格納したものをPrintDlg関数に渡すようにする。
ただし,hDevModeメンバとhDevNamesメンバに0を指定してもよい。その場合には[通常使うプリンタ]の設定が[プリンタの設定]ダイアログボックスに表示される。なお,hDevModeメンバとhDevNamesメンバに0を指定した場合には,ユーザーが選択したプリンタ情報を確保するメモリをWindows側が準備する。そのため,後述するGlobalFree関数を使い,それらのメモリを解放しなければならない。
Table 7-19を参照するとわかるように,DEVMODE構造体のほとんどのメンバがPrinterオブジェクトの何らかのプロパティに対応している。
そこで,List 7-54のようにすると,その時点のデフォルトプリンタの状態をDEVMODE構造体に格納することができる。
List 7-54では,vDevModeというDEVMODE構造体の変数を用意し,そこにPrinterオブジェクトの各プロパティの値を設定することで,デフォルトプリンタの状態を示すようにvDevMode変数を初期化している。
List 7-54では,途中でOn Error Resume Nextステートメントを使ってエラーをトラップし,ErrオブジェクトのNumberプロパティを参照し,エラーがないかどうかを調べるようにしている。これは,プリンタの機種やデバイスドライバによっては,Printerオブジェクトの一部プロパティにアクセスするときに実行時エラーが発生するので,それを回避するための処置である。List 7-54の場合,実行時エラーが発生したときには,その値はvDevMode変数に設定しないという方法で対応している。
また,14〜27行目では用紙サイズを設定しているが,この部分はやや複雑な処理になっている。プリンタの用紙サイズには,(1)A4,B4,レターサイズといった定型サイズ,(2)ユーザーが自由に設定できるカスタムサイズ,の2種類がある。(1)の場合,用紙を設定する定数がPrinterオブジェクトのPaperSizeプロパティに格納される。一方,(2)の場合には,用紙の幅と高さがそれぞれPrinterオブジェクトのWidthプロパティとHeightプロパティに格納され,PaperSizeプロパティには0またはvbPRPSUser定数が格納される。
そのため,15行目にあるように,まずPaperSizeプロパティがvbPRPSUser定数であるかどうかを調べ,それが定型用紙なのか不定形用紙なのかを調べる必要がある。定型用紙の場合,用紙の高さと幅にはそれぞれ0を設定すればよい。しかし,不定形用紙の場合には,用紙の高さと幅をそれぞれ明示的に設定しなければならない。
なお,DEVMODE構造体で設定する用紙の高さと幅の単位は,1/10ミリメートルである。そのため,ScaleXメソッドとScaleYメソッドを使って単位を変換する必要がある(25,26行目)。
| 60/134 |
