方法: ユーザーから印刷ジョブ情報を収集する
このトピックでは、ユーザーから印刷ジョブ情報を収集する方法について説明します。
概要
PrintDlg 関数を呼び出して、ユーザーから印刷ジョブ情報を収集します。 この関数は、[ 印刷 ] 共通ダイアログ ボックスをユーザーに表示し、 PRINTDLG データ構造で印刷ジョブ情報を返します。
ユーザーが 印刷ジョブを 開始すると、[印刷] 共通ダイアログ ボックスが表示されます。 [共通の印刷] ダイアログ ボックスはモーダル ダイアログ ボックスです。つまり、共通ダイアログ ボックスが閉じられるまで、ユーザーはメイン ウィンドウを操作できません。
印刷ジョブ情報の収集
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;
[ 印刷 ] 共通ダイアログ ボックスを表示します。
次のコード例に示すように、初期化された PRINTDLG 構造体を使用して PrintDlg を呼び出して、[印刷] 共通ダイアログ ボックスを表示し、ユーザー データを収集します。
// Display the printer dialog and retrieve the printer DC pdReturn = PrintDlg(&pd);
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);
ユーザーが [印刷] 共通ダイアログ ボックスの [キャンセル] ボタンをクリックした場合、それ以上の処理は実行されません。