Como coletar informações de trabalho de impressão do usuário

Este tópico descreve como coletar informações de trabalho de impressão do usuário.

Visão geral

Colete informações do trabalho de impressão do usuário chamando a função PrintDlg . Essa função exibe a caixa de diálogo Imprimir comum para o usuário e retorna as informações do trabalho de impressão em uma estrutura de dados PRINTDLG .

A caixa de diálogo Imprimir comum é exibida quando o usuário inicia um trabalho de impressão. A caixa de diálogo Imprimir comum é uma caixa de diálogo modal, o que significa que o usuário não pode interagir com a janela main até que a caixa de diálogo comum seja fechada.

Coletando informações do trabalho de impressão

  1. Inicialize o elemento de estrutura PRINTDLG .

    Antes que um programa possa exibir a caixa de diálogo Imprimir comum, ele deve alocar e inicializar uma estrutura PRINTDLG . Em seguida, ele passa essa estrutura para a função PrintDlg , que exibe a caixa de diálogo e retorna os dados do trabalho de impressão na mesma estrutura. O exemplo de código a seguir mostra como o programa de exemplo executa essa etapa.

    // 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. Exiba a caixa de diálogo Imprimir comum.

    Chame PrintDlg com a estrutura PRINTDLG inicializada para exibir a caixa de diálogo Imprimir comum e coletar os dados do usuário, conforme mostrado no exemplo de código a seguir.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Salve os campos da estrutura PRINTDLG e inicie o trabalho de impressão.

    A estrutura PRINTDLG contém os dados que descrevem as seleções feitas pelo usuário na caixa de diálogo de impressão. Alguns membros da estrutura PRINTDLG são identificadores para objetos de memória global. O Programa de Exemplo de Impressão copia os dados dos objetos de memória global para blocos de memória que o programa gerencia e copia outros campos da estrutura PRINTDLG para campos em uma estrutura de dados definida pelo programa.

    Depois de armazenar os dados da estrutura PRINTDLG na estrutura de dados do programa, você poderá abrir a caixa de diálogo de progresso da impressão. O procedimento da caixa de diálogo progresso da impressão manipula as mensagens da caixa de diálogo e inicia o thread de processamento de impressão.

    O exemplo de código a seguir mostra como copiar os dados da estrutura PRINTDLG para a estrutura de dados do programa e como iniciar o trabalho de impressão.

    // 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. Se o usuário clicar no botão Cancelar na caixa de diálogo Imprimir comum, nenhum processamento adicional será executado.