Практическое руководство. Сбор сведений о задании печати от пользователя
В этом разделе описывается сбор сведений о задании печати от пользователя.
Общие сведения
Сбор сведений о задании печати от пользователя путем вызова функции PrintDlg . Эта функция отображает для пользователя диалоговое окно Печать общего и возвращает сведения о задании печати в структуре данных PRINTDLG .
Когда пользователь запускает задание печати, отображается диалоговое окно Печать общего. Стандартное диалоговое окно Печать — это модальное диалоговое окно, которое означает, что пользователь не может взаимодействовать с окном main, пока общее диалоговое окно не будет закрыто.
Сбор сведений о задании печати
Инициализируйте элемент структуры 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 являются дескрипторами для объектов глобальной памяти. Программа print Sample Program копирует данные из объектов глобальной памяти в блоки памяти, которыми управляет программа, и копирует другие поля из структуры 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);
Если пользователь нажимает кнопку Отмена в диалоговом окне Печать общего, дальнейшая обработка не выполняется.