方法: ユーザーから印刷ジョブ情報を収集する

このトピックでは、ユーザーから印刷ジョブ情報を収集する方法について説明します。

概要

PrintDlg 関数を呼び出して、ユーザーから印刷ジョブ情報を収集します。 この関数は、[ 印刷 ] 共通ダイアログ ボックスをユーザーに表示し、 PRINTDLG データ構造で印刷ジョブ情報を返します。

ユーザーが 印刷ジョブを 開始すると、[印刷] 共通ダイアログ ボックスが表示されます。 [共通の印刷] ダイアログ ボックスはモーダル ダイアログ ボックスです。つまり、共通ダイアログ ボックスが閉じられるまで、ユーザーはメイン ウィンドウを操作できません。

印刷ジョブ情報の収集

  1. PRINTDLG 構造体要素を初期化します。

    プログラムは、[ 印刷 ] 共通ダイアログ ボックスを表示する前に、 PRINTDLG 構造体を割り当てて初期化する必要があります。 次に、この構造体を PrintDlg 関数に渡します。これにより、ダイアログが表示され、同じ構造の印刷ジョブ データが返されます。 次のコード例は、サンプル プログラムがこの手順を実行する方法を示しています。

    // Initialize the print dialog box's data structure.
    pd.lStructSize = sizeof( pd );
    pd.Flags = 
        // Return a printer device context
        PD_RETURNDC 
        // Don't allow separate print to file.
        | PD_HIDEPRINTTOFILE        
        | PD_DISABLEPRINTTOFILE 
        // Don't allow selecting individual document pages to print.
        | PD_NOSELECTION;
    
  2. [ 印刷 ] 共通ダイアログ ボックスを表示します。

    次のコード例に示すように、初期化された PRINTDLG 構造体を使用して PrintDlg を呼び出して、[印刷] 共通ダイアログ ボックスを表示し、ユーザー データを収集します。

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. PRINTDLG 構造体からフィールドを保存し、印刷ジョブを開始します。

    PRINTDLG 構造体には、ユーザーが印刷ダイアログ ボックスで行った選択内容を説明するデータが含まれています。 PRINTDLG 構造体の一部のメンバーは、グローバル メモリ オブジェクトへのハンドルです。 印刷サンプル プログラムは、グローバル メモリ オブジェクトから、プログラムが管理するメモリ ブロックにデータをコピーし、PRINTDLG 構造体からプログラムが定義したデータ構造のフィールドに他のフィールドをコピーします。

    PRINTDLG 構造体のデータをプログラムのデータ構造に格納した後、印刷の進行状況ダイアログ ボックスを開くことができます。 印刷の進行状況ダイアログ ボックス プロシージャは、ダイアログ ボックスメッセージを処理し、印刷処理スレッドを開始します。

    次のコード例は、 PRINTDLG 構造体からプログラムのデータ構造にデータをコピーする方法と、印刷ジョブを開始する方法を示しています。

    // A printer was returned so copy the information from 
    //  the dialog box structure and save it to the application's
    //  data structure.
    //
    //  Lock the handles to get pointers to the memory they refer to.
    PDEVMODE    devmode = (PDEVMODE)GlobalLock(pd.hDevMode);
    LPDEVNAMES  devnames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
    
    // Free any old devmode structures and allocate a new one and
    // copy the data to the application's data structure.
    if (NULL != threadInfo->devmode)
    {
        HeapFree(GetProcessHeap(), 0L, threadInfo->devmode);
    }
    
    threadInfo->devmode = (LPDEVMODE)HeapAlloc(
        GetProcessHeap(), 
        PRINT_SAMPLE_HEAP_FLAGS, 
        devmode->dmSize);
    
    if (NULL != threadInfo->devmode) 
    {
        memcpy(
            (LPVOID)threadInfo->devmode,
            devmode, 
            devmode->dmSize);
    }
    else
    {
        // Unable to allocate a new structure so leave
        // the pointer as NULL to indicate that it's empty.
    }
    
    // Save the printer name from the devmode structure
    //  This is to make it easier to use. It could be
    //  used directly from the devmode structure.
    threadInfo->printerName = threadInfo->devmode->dmDeviceName;
    
    // Set the number of copies as entered by the user
    threadInfo->copies = pd.nCopies;
    
    // Some implementations might support printing more than
    // one package in a print job. For this program, only
    // one package (XPS document) can be printed per print job.
    threadInfo->packages = 1;
    
    // free allocated buffers from PRINTDLG structure
    if (NULL != pd.hDevMode) GlobalFree(pd.hDevMode);
    if (NULL != pd.hDevNames) GlobalFree(pd.hDevNames);
    
    // Display the print progress dialog box
    DialogBox(
        threadInfo->applicationInstance, 
        MAKEINTRESOURCE(IDD_PRINT_DLG), 
        hWnd, 
        PrintDlgProc);
    
  4. ユーザーが [印刷] 共通ダイアログ ボックスの [キャンセル] ボタンをクリックした場合、それ以上の処理は実行されません。