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

7.4.7 顧客情報の印刷処理
●Win32APIを使ってユーザーにプリンタを選択させる
 ではどうするのかというと,Win32APIを使うことになる。Visual Basicのコモンダイアログの機能は,Win32APIの呼び出しを代行したものである。Win32APIを直接呼び出すと,プリンタや用紙サイズを切り替えるなど,より細かく設定を変更できるようになる。

 以下,Win32APIを使ってプリンタや用紙サイズを設定する方法を説明する。

PrintDlg関数
 Win32APIには,PrintDlgという関数が用意されている。この関数を用いると,[印刷]ダイアログボックスや[プリンタの設定]ダイアログボックスを表示することができる。Visual BasicでコモンダイアログのShowPrinterメソッドを呼び出したときには,内部でPrintDlg関数が呼び出されている。

 PrintDlg関数を使うには,次のようにDeclare宣言する。

Public Declare Function PrintDlg Lib "comdlg32.dll" _
    Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As Long

 PrintDlg関数は,引数に指定したPRINTDLG構造体のとおりに[印刷]ダイアログボックスや[プリンタの設定]ダイアログボックスを表示し,ユーザーが選択したプリンタの情報を,そのPRINTDLG構造体に返す。また,ユーザーが[印刷]ダイアログボックスや[プリンタの設定]ダイアログボックスで[キャンセル]ボタンを押したときには0が戻り,[OK]ボタンを押したときには0以外の値が戻るという仕様になっている。

 PRINTDLG構造体は,Table 7-18のように定義される。

Table 7-18 PRINTDLG構造体

【定義】

Public Type PRINTDLG
    lStructSize As Long
    hwndOwner As Long
    hDevMode As Long
    hDevNames As Long
    hdc As Long
    Flags As Long
    nFromPage As Integer
    nToPage As Integer
    nMinPage As Integer
    nMaxPage As Integer
    nCopies As Integer
    hInstance As Long
    lCustData As Long
    lpfnPrintHook As Long
    lpfnSetupHook As Long
    lpPrintTemplateName As String
    lpSetupTemplateName As String
    hPrintTemplate As Long
    hSetupTemplate As Long
End Type

【各メンバの意味】

メンバ解説
lStructSizeこの構造体のバイト数。バイト数を求めるにはLen関数を使う
hwndOwner表示するダイアログボックスの親となるフォームのハンドル。フォームのハンドルを取得するには,フォームのhWndプロパティを使えばよい
hDevModeプリンタの名前や用紙の設定など,プリンタの情報が設定されたDEVMODE構造体のハンドル。DEVMODE構造体にプリンタ情報を設定してから関数を呼び出せば,ダイアログボックスが表示されるときにそれがデフォルトとしてユーザーに表示される。関数から戻ると,このDEVMODE構造体に,ユーザーが選択したプリンタの情報が格納される
hDevNamesプリンタの名前,出力ポート名(LPT1:など),プリンタの通称などの情報が格納されたDEVNAMES構造体のハンドル。DEVNAMES構造体にプリンタの名前を設定して関数を呼び出せば,ダイアログボックスが表示されるときにそれがデフォルトとしてユーザーに表示される。関数から戻ると,このDEVNAMES構造体にユーザーが選択したプリンタの情報が格納される
hDC関数から戻ったときにプリンタの情報を示すデバイスコンテキストまたは情報コンテキストが格納される。FlagsメンバにPD_RETURNDCPD_RETURNICを指定したときのみ有効

Flags

ダイアログボックスの表示方法を設定するフラグ。以下の値の組み合わせを指定する。各定数の値については,List 7-52を参照
定数解説
PD_ALLPAGES印刷範囲の[すべて]ラジオボタンの状態を設定または取得する
PD_COLLATE[部単位で印刷]の状態を設定または取得する
PD_DISABLEPRINTTOFILE[ファイルへ出力]チェックボックスを無効にする
PD_ENABLEPRINTHOOKlpfnPrintHookメンバを有効にし,処理をフックする
PD_ENABLETEMPLATEhInstanceメンバとlpPrintTemplateNameメンバを有効にし,ダイアログボックスの形状を変更する
PD_ENABLEPRINTTEMPLATEHANDLEhPrintTemplateメンバを有効にし,ダイアログボックスの形状を変更する
PD_ENABLESETUPHOOKlpfnSetupHookメンバを有効にし,処理をフックする
PD_ENABLESETUPTEMPLATEhInstanceメンバとlpSetupTemplateNameメンバを有効にし,ダイアログボックスの形状を変更する
PD_ENABLESETUPTEMPLATEHANDLEhPrintTemplateメンバを有効にし,ダイアログボックスの形状を変更する
PD_HIDEPRINTTOFILE

[ファイルへ出力]チェックボックスを表示しない

PD_NONETWORKBUTTON

[ネットワーク]ボタンを表示しない

PD_NOWARNING

[通常使うプリンタ]がない場合にも警告を出さない

PD_PAGENUM

[ページ指定]の部分を設定または取得する。このフラグを指定すると,nFromPageメンバとnToPageメンバが有効になる

PD_PRINTSETUP

[プリンタの設定]ダイアログボックスを表示する。この値が指定されなかったときには[印刷]ダイアログボックスが表示される

PD_PRINTTOFILE

[ファイルへ出力]を選択された状態にする

PD_RETURNDC

ユーザーが選択したプリンタのデバイスコンテキストを取得し,hDCメンバを経由してアクセスできるようにする

PD_RETURNDEFAULT

ダイアログボックスをユーザーには表示しない。[通常使うプリンタ]に設定されているプリンタの情報を,hDevModeメンバとhDevNamesメンバに格納するだけである

PD_RETURNIC

ユーザーが選択したプリンタの情報コンテキストを取得し,hDCメンバを経由してアクセスできるようにする

PD_SELECTION

[選択した部分]ラジンボタンが選択された状態にする

PD_SHOWHELP[ヘルプ]ボタンを表示する
PD_USEDEVMODECOPIESPD_USEDEVMODECOPIESANDCOLLATE定数と同じ
PD_USEDEVMODECOPIESSANDCOLLATEプリンタドライバが複数部数印刷をサポートしていない場合に[印刷部数]の項目を無効にする
nFromPage印刷開始ページ。関数を呼び出すときに,この値が印刷開始ページの初期値として表示される。関数から戻ると,ユーザーが入力した印刷開始ページが格納される
nToPage印刷終了ページ。関数を呼び出すときに,この値が印刷開始ページの終了ページの初期値として表示される。関数から戻ると,ユーザーが入力した印刷終了ページが格納される
nMinPageユーザーが印刷ページ範囲として指定できる最小ページ番号を指定する
nMaxPageユーザーが印刷ページ範囲として指定できる最大ページ番号を指定する
nCopies印刷部数。関数を呼び出すときに,この値が印刷部数の初期値として表示される。関数から戻ると,ユーザーが入力した印刷部数の値が格納される
hInstanceFlagsメンバでPD_ENABLEPRINTTEMPLATEまたはPD_ENABLESETUPTEMPLATEが指定されたとき,ダイアログボックスを示す形状を保持するリソースのインスタンス。この機能を使うと,ダイアログボックスの形状を任意の形に置き換えることができる。しかし,Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する
lCustDatalpfnPrintHookメンバやlpfnSetupHookメンバで指定したコールバック関数に引き渡す引数を指定する。Visual Basicでコールバック関数を使うのは困難であるから詳細は割愛するが,0を渡せばよい
lpfnPrintHook[印刷]ダイアログボックスを表示するときの処理をフックするコールバック関数を指定する。Visual Basicでコールバック関数を使うのは困難であるから,詳細は割愛する
lpfnSetupHook[プリンタの設定]ダイアログボックスを表示するときの処理をフックするコールバック関数を指定する。Visual Basicでコールバック関数を使うのは困難であるから詳細は割愛する
lpPrintTemplateName[印刷]ダイアログボックスの表示に使うダイアログボックスのテンプレート名を指定する。Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する
lpSetupTemplateName[プリンタの設定]ダイアログボックスの表示に使うダイアログボックスのテンプレート名を指定する。Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する
hPrintTemplate[印刷]ダイアログボックスのテンプレート(形状)を保持するメモリへのハンドルを指定する。Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する
hSetupTemplate[プリンタの設定]ダイアログボックスのテンプレート(形状)を保持するメモリへのハンドルを指定する。Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する

 PrintDlg関数を用いるうえで知っておかなければならないのは,PRINTDLG構造体のhDevModeメンバとhDevNamesメンバである。hDevModeメンバはプリンタの情報を格納するDEVMODE構造体,hDevNamesメンバはプリンタの名前を格納するDEVNAMES構造体を示す。

 PrintDlg関数を呼び出す際には,あらかじめその時点のプリンタ情報をDEVMODE構造体とDEVNAMES構造体に格納したメモリ領域を作っておき,それをそれぞれhDevModeメンバとhDevNamesメンバに渡す。すると,その情報に合致するプリンタが初期値として表示された状態で,[印刷]または[プリンタの設定]ダイアログボックスが表示される。ユーザーがダイアログボックスで[OK]ボタンを押したら,ユーザーの選択したプリンタにかかわる情報がDEVMODE構造体とDEVNAMES構造体に格納されて戻ってくる。

Prev 59/134 Next