この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.7 顧客情報の印刷処理
●Win32APIを使ってユーザーにプリンタを選択させる

DEVMODE構造体
 まずは,DEVMODE構造体から説明する。DEVMODE構造体は,Table 7-19のように定義されている。

Table 7-19 DEVMODE構造体

【定義】

Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32
Public Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmLogPixels As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

【各メンバの意味】

メンバ解説
dmDeviceNameプリンタのデバイス名。PrinterオブジェクトのDeviceNameプロパティに相当する
dmSpecVersionバージョン番号
dmDriverVersionプリンタのデバイスドライバのバージョン
dmSizeこの構造体のバイト数。バイト数を求めるにはLen関数を使う
dmDriverExtraこの構造体の後ろに付いているデバイスドライバ固有のデータのバイト数。通常は0を設定する

dmFields

この構造体のメンバのうち,有効な値のフラグ。次の定数の組み合わせで指定する。たとえば,DM_ORIENTATIONDM_PAPERSIZEが指定されていたときには,dmOrientationメンバとdmPaperSizeメンバには有効な値が格納されているということを示す。逆にいうと,それ以外のメンバには有効な値が格納されておらず,無視されているということを示す。各定数の値についてはList 7-53を参照
定数有効なメンバ
DM_ORIENTATIONdmOrientation
DM_PAPERSIZEdmPaperSize
DM_PAPERLENGTHdmPaperLength
DM_PAPERWIDTHdmPaperWidth
DM_SCALEdmScale
DM_COPIESdmCopies
DM_DEFAULTSOURCEdmDefaultSource
DM_PRINTQUALITYdmPrintQuality
DM_COLORdmColor
DM_DUPLEXdmDuplex
DM_YRESOLUTIONdmYResolution
DM_TTOPTIONdmTTOption
DM_COLLATEdmCollate
DM_FORMNAMEdmFormName
DM_LOGPIXELSdmLogPixels
DM_BITSPERPELdmBitsPerPel
DM_PELSWIDTHdmPelsWidth
DM_PELSHEIGHTdmPelsHeight
DM_DISPLAYFLAGSdmDisplayFlags
DM_DISPLAYFREQUENCYdmDisplayFrequency
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)
dmTTOptionTrueTypeフォントの描画方法。ビットマップとして印刷するか,そのまま送信するか,アウトラインをとるか,置換するか,などの設定。設定値についてはWin32 SDKのドキュメントを参照
dmCollate複数部数を印刷するときに部数ごとに並び替えるかどうかの設定
dmFormName用紙の名前。「A4」や「B4」などの名称であり,Windows NTやWindows 2000のみで有効
dmLogPixelsプリンタの設定では利用されない
dmBitsPerPelプリンタの設定では利用されない
dmPelsWidthプリンタの設定では利用されない
dmPelsHeightプリンタの設定では利用されない
dmDisplayFlagsプリンタの設定では利用されない
dmDisplayFrequencyプリンタの設定では利用されない


One Point!Table 7-19で示した定義は,Windows 3.1やWindows NT 4.0以前のものである。Windows 95,Windows 98,Windows 2000では,ICM(Image Color Management)によるカラーマッチングの設定項目がさらに後ろに追加されているが,その詳細は割愛する。

 [プリンタの設定]ダイアログボックスを表示するときには,その時点のデフォルトプリンタの状態を初期値として表示するのが一般的である。そこで,あらかじめその時点のプリンタの設定をDEVMODE構造体に格納し,それをさらにPRINTDLG構造体に格納したものをPrintDlg関数に渡すようにする。


One Point! ただし,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行目)。

Prev 60/134 Next