この特集のトップページへ
>
Chapter 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_RETURNDCかPD_RETURNICを指定したときのみ有効 | |
Flags | ダイアログボックスの表示方法を設定するフラグ。以下の値の組み合わせを指定する。各定数の値については,List 7-52を参照 | |
定数 | 解説 | |
PD_ALLPAGES | 印刷範囲の[すべて]ラジオボタンの状態を設定または取得する | |
PD_COLLATE | [部単位で印刷]の状態を設定または取得する | |
PD_DISABLEPRINTTOFILE | [ファイルへ出力]チェックボックスを無効にする | |
PD_ENABLEPRINTHOOK | lpfnPrintHookメンバを有効にし,処理をフックする | |
PD_ENABLETEMPLATE | hInstanceメンバとlpPrintTemplateNameメンバを有効にし,ダイアログボックスの形状を変更する | |
PD_ENABLEPRINTTEMPLATEHANDLE | hPrintTemplateメンバを有効にし,ダイアログボックスの形状を変更する | |
PD_ENABLESETUPHOOK | lpfnSetupHookメンバを有効にし,処理をフックする | |
PD_ENABLESETUPTEMPLATE | hInstanceメンバとlpSetupTemplateNameメンバを有効にし,ダイアログボックスの形状を変更する | |
PD_ENABLESETUPTEMPLATEHANDLE | hPrintTemplateメンバを有効にし,ダイアログボックスの形状を変更する | |
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_USEDEVMODECOPIES | PD_USEDEVMODECOPIESANDCOLLATE定数と同じ | |
PD_USEDEVMODECOPIESSANDCOLLATE | プリンタドライバが複数部数印刷をサポートしていない場合に[印刷部数]の項目を無効にする | |
nFromPage | 印刷開始ページ。関数を呼び出すときに,この値が印刷開始ページの初期値として表示される。関数から戻ると,ユーザーが入力した印刷開始ページが格納される | |
nToPage | 印刷終了ページ。関数を呼び出すときに,この値が印刷開始ページの終了ページの初期値として表示される。関数から戻ると,ユーザーが入力した印刷終了ページが格納される | |
nMinPage | ユーザーが印刷ページ範囲として指定できる最小ページ番号を指定する | |
nMaxPage | ユーザーが印刷ページ範囲として指定できる最大ページ番号を指定する | |
nCopies | 印刷部数。関数を呼び出すときに,この値が印刷部数の初期値として表示される。関数から戻ると,ユーザーが入力した印刷部数の値が格納される | |
hInstance | FlagsメンバでPD_ENABLEPRINTTEMPLATEまたはPD_ENABLESETUPTEMPLATEが指定されたとき,ダイアログボックスを示す形状を保持するリソースのインスタンス。この機能を使うと,ダイアログボックスの形状を任意の形に置き換えることができる。しかし,Visual Basicでリソースを扱うのは困難であるから,詳細は割愛する | |
lCustData | lpfnPrintHookメンバや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構造体に格納されて戻ってくる。
59/134 |