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

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

概要

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

[ 印刷 の共通] ダイアログボックスは、ユーザーが印刷ジョブを開始したときに表示されます。 [ 印刷 の共通] ダイアログボックスはモーダルダイアログボックスです。これは、コモンダイアログボックスが閉じられるまで、ユーザーがメインウィンドウと対話できないことを意味します。

印刷ジョブの情報を収集しています

  1. PRINTDLG structure 要素を初期化します。

    プログラムで [ 印刷 の共通] ダイアログボックスを表示するには、 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 構造体の一部のメンバーは、グローバルメモリオブジェクトへのハンドルです。 Print Sample プログラムは、グローバルメモリオブジェクトからプログラムが管理するメモリブロックにデータをコピーし、その他のフィールドを 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. [印刷 の共通] ダイアログボックスでユーザーが [キャンセル] ボタンをクリックした場合、それ以上の処理は実行されません。