Cara: Mengumpulkan Informasi Pekerjaan Cetak dari Pengguna
Topik ini menjelaskan cara mengumpulkan informasi pekerjaan cetak dari pengguna.
Ikhtisar
Kumpulkan informasi pekerjaan cetak dari pengguna dengan memanggil fungsi PrintDlg. Fungsi ini menampilkan kotak dialog Cetak umum kepada pengguna, dan mengembalikan informasi pekerjaan cetak dalam struktur dataPRINTDLG.
Kotak dialog Cetak umum ditampilkan saat pengguna memulai pekerjaan cetak. Kotak dialog Cetak umum adalah kotak dialog modal, yang berarti bahwa pengguna tidak dapat berinteraksi dengan jendela utama hingga kotak dialog umum ditutup.
Mengumpulkan Informasi Pekerjaan Cetak
Inisialisasi elemen struktur PRINTDLG.
Sebelum program dapat menampilkan kotak dialog umum Cetak, program harus mengalokasikan dan menginisialisasi struktur PRINTDLG. Kemudian meneruskan struktur ini ke fungsiPrintDlg, yang menampilkan dialog dan mengembalikan data pekerjaan cetak dalam struktur yang sama. Contoh kode berikut menunjukkan bagaimana program sampel melakukan langkah ini.
// 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;
Tampilkan kotak dialog Cetak umum.
Panggil PrintDlg dengan struktur PRINTDLG yang diinisialisasi untuk menampilkan kotak dialog umum Cetak dan mengumpulkan data pengguna, seperti yang ditunjukkan dalam contoh kode berikut.
// Display the printer dialog and retrieve the printer DC pdReturn = PrintDlg(&pd);
Simpan bidang dari struktur PRINTDLG dan mulai pekerjaan cetak.
StrukturPRINTDLG berisi data yang menjelaskan pilihan yang dibuat pengguna dalam kotak dialog cetak. Beberapa anggota struktur PRINTDLG adalah penunjuk ke objek memori global. Program Sampel Cetak menyalin data dari objek memori global ke blok memori yang dikelola program dan menyalin bidang lain dari PRINTDLG struktur ke bidang dalam struktur data yang ditentukan program.
Setelah Menyimpan data dari struktur PRINTDLG dalam struktur data program, Anda dapat membuka kotak dialog kemajuan cetak. Prosedur kotak dialog kemajuan cetak menangani pesan kotak dialog dan memulai utas pemrosesan cetak.
Contoh kode berikut menunjukkan cara menyalin data dari strukturPRINTDLG ke struktur data program dan cara memulai pekerjaan cetak.
// 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);
Jika pengguna mengklik tombol Batalkan dalam kotak dialog umum Cetak, tidak ada pemrosesan lebih lanjut yang dilakukan.