Практическое руководство. Сбор сведений о задании печати от пользователя

В этом разделе описывается сбор сведений о задании печати от пользователя.

Общие сведения

Сбор сведений о задании печати от пользователя путем вызова функции PrintDlg . Эта функция отображает для пользователя диалоговое окно Печать общего и возвращает сведения о задании печати в структуре данных PRINTDLG .

Когда пользователь запускает задание печати, отображается диалоговое окно Печать общего. Стандартное диалоговое окно Печать — это модальное диалоговое окно, которое означает, что пользователь не может взаимодействовать с окном main, пока общее диалоговое окно не будет закрыто.

Сбор сведений о задании печати

  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 являются дескрипторами для объектов глобальной памяти. Программа 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);
    
  4. Если пользователь нажимает кнопку Отмена в диалоговом окне Печать общего, дальнейшая обработка не выполняется.