その2今回はプリンタの「ページ設定」についてします。ページ設定ダイアログは左の図のようなものです。用紙の向き、周囲の空白などを設定します。押すと他のプリンタの設定もできます。これは、PageSetupDlg関数で行います。PageSetupDlg関数を見てみましょう。lppsd);lppsdにはPAGESETUPDLG構造体へのポインタを指定します。ユーザーがOKボタンを押すと0以外が返ります。押すか、エラーが発生した場合は0が返ります。PAGESETUPDLG構造体は、次のように定義されています。lStructSizeは、この構造体のサイズです。hwndOwnerは、このダイアログボックスのオーナーのウィンドウハンドルです。オーナーがいないときはNULL似もなり得ます。hDevModeは、DEVNAMES構造体のグローバルメモリオブジェクトのハンドルです。グローバルメモリオブジェクトのハンドルを指定します。項目が入ったDEVNAMES構造体のグローバルメモリオブジェクトのハンドルとなります。ユーザーが何も選択しなかったときはNULLになります。hDevNamesは、DEVNAMES構造体のグローバルメモリオブジェクトのハンドルです。この構造体には、ドライバーの名前、プリンターの名前、出力ポートの名前を含んでいます。グローバルメモリオブジェクトのハンドルを指定します。ユーザーが何も選択しなかったときはNULLとなります。Flagsには、ページ設定ダイアログボックスを初期化するのに使われるビットフラグのセットです。次の組み合わせで指定します。プリンタに許された最小のマージンを設定します。PSD_MARGINSや、PSD_MINMARGINSがあると無視されます。マージンコントロールを使用不能にします。「向き」を使用不能にします。サンプルページの描画をしません。設定してあってもサンプルページは描画する事ができます。ペーパーコントロールを使用不能にします。ユーザーがペーパーサイズやペーパーソース(給紙方法)をセットできないようにします。プリンタボタンを使用不能にします。lpfnPagePaintHookメンバを有効にします。フックプロシージャを有効にします。プレロードされたダイアログボックスのデータブロックを指していることを示します。このフラグが立っていると、lpPageSetupTemplateNameメンバは無視されます。ミリメートルの100分の1になります。ptPageSizeメンバの単位がミリメートルの100分の1になります。サイズの単位がインチの1000分の1となります。rtMarginメンバで指定された値をシステムに使わせます。これがセットされていないとすべてのマージンに1インチがセットされます。rtMinMarginメンバに指定された値をシステムに使わせます。ユーザーにこの値より小さい値を使わせるのを防ぎます。ネットワークボタンを隠します。デフォルトプリンタが存在しないときのワーニングを表示しません。PageSetupDlg関数はダイアログボックスを表示しません。hDevNamesをセットします。ヘルプボタンを表示します。hwndOwnerはHELPMSGSTRING登録メッセージを処理しなくてはなりません。ユーザーによって選択された用紙の寸法を指定します。許される最小のマージンを指定します。PSD_MINMARGINSフラグがセットされていないと無視されます。rtMarginは、マージンの値を指定します。rtMarginはマージン値を初期化します。ユーザーによってセットされた値が格納されています。含むアプリケーションまたはモジュールのインスタンスハンドルを指定します。フラグをセットしたとき)lCustDataには、アプリケーション定義のデータを指定します。プロシージャに送られます。lpfnPageSetupHookには、PageSetupHookフックプロシージャのポインタを指定します。PSD_ENABLEPAGESETUPHOOKフラグがセットされていないと無視されます。lpfnPagePaintHookには、PagePaintHookフックプロシージャのポインタを指定します。PSD_ENABLEPAGEPAINTHOOKフラグがセットされていないと無視されます。PSD_ENABLEPAGESETUPTEMPLATEフラグがセットされていないと無視されます。これには、PSD_ENABLEPAGESETUPTEMPLATEHANDLEフラグがセットされていなくてはなりません。その前に現在の状態をGetPrinter関数で取得しておく必要があります。普通に使用するとエラーとなります。pcbNeeded);hPrinterには、プリンタのハンドルを指定します。これは、OpenPrinterまたはAddPrinter関数で取得できます。Levelには、pPrinterによって指し示されたバッファに蓄える構造体のレベルを指定します。Windows95/98では1,2,5が使用できます。NT/2000では、1,2,3,4,5,7,8,9が使えます。pPrinterには、指定されたプリンタに関する情報を格納する構造体のポインタを指定します。Levelで指定したレベルnに対してPRINTER_INFO_n構造体が使われます。cbBufには、pPrinterで示されたバッファのサイズを指定します。pcbNeededには、プリンタ情報のサイズを格納する変数のポインタを指定します。この値よりcbBufが小さいときGetPrinter関数は失敗します。それよりも大きいとき関数は成功し、その値はバッファに蓄えられたバイト数を表します。関数が成功すると0以外の値を返します。失敗すると0を返します。通常プリンタ情報を取得するときはレベル2を使います。&dwNeeded);というような感じで使うように思われますが、これは失敗します。&dwNeeded);と2段がまえで実行する必要があります。用意しておいて使うという手もあります。*)prn;さて、いずれにしてもプリンタの名前を取得しなくてはいけません。これは、PAGESETUPDLG構造体から取得することにします。情報が含まれています。このhDevModeメンバを使うことにします。複雑なので、あとの章で解説することにします。*)(pdev->dmDeviceName));のようにすれば取得できます。変更点をPRINTER_INFO_2構造体のpDevModeメンバに書き込みます。DEVMODE構造体のデバイス依存部分のアップデートをしなくてはいけません。fMode);指定されたプリンタの初期化された情報を取得したり、変更したりします。プリンタ設定プロパティシートを表示したりします。95/98では、PrinterProperties関数と同じプロパティシートを表示します。第79章で解説してあるのでこちらを見てください。hWndには、プロパティシートの親ウィンドウのハンドルを指定します。hPrinterには、プリンタハンドルを指定します。pDeviceNameには、デバイス名を指定します。DEVMODE構造体へのポインタを指定します。(DE_IN_BUFFERフラグがセットされたときのみ使われます。)fModeは、この関数の動作を指定します。それ以外の時は次の組み合わせで指定します。DEVMODE構造体の設定とをマージします。ユーザーによって入力される値でDEVMODE構造体の設定を変更します。