Cómo: Recopilar información del trabajo de impresión del usuario

En este tema se describe cómo recopilar información del trabajo de impresión del usuario.

Información general

Recopile la información del trabajo de impresión del usuario mediante una llamada a la función PrintDlg . Esta función muestra el cuadro de diálogo Imprimir común al usuario y devuelve la información del trabajo de impresión en una estructura de datos PRINTDLG .

El cuadro de diálogo Imprimir común se muestra cuando el usuario inicia un trabajo de impresión. El cuadro de diálogo Imprimir común es un cuadro de diálogo modal, lo que significa que el usuario no puede interactuar con la ventana principal hasta que se cierre el cuadro de diálogo común.

Recopilación de información del trabajo de impresión

  1. Inicialice el elemento de estructura PRINTDLG .

    Para que un programa pueda mostrar el cuadro de diálogo Imprimir común , debe asignar e inicializar una estructura PRINTDLG . A continuación, pasa esta estructura a la función PrintDlg , que muestra el cuadro de diálogo y devuelve los datos del trabajo de impresión en la misma estructura. En el ejemplo de código siguiente se muestra cómo realiza este paso el programa de ejemplo.

    // 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. Muestra el cuadro de diálogo Imprimir común.

    Llame a PrintDlg con la estructura PRINTDLG inicializada para mostrar el cuadro de diálogo Imprimir común y recopilar los datos de usuario, como se muestra en el ejemplo de código siguiente.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Guarde los campos de la estructura PRINTDLG e inicie el trabajo de impresión.

    La estructura PRINTDLG contiene los datos que describen las selecciones realizadas por el usuario en el cuadro de diálogo de impresión. Algunos miembros de la estructura PRINTDLG son controladores para objetos de memoria global. El Programa de muestra de impresión copia los datos de los objetos de memoria global en bloques de memoria que el programa administra y copia otros campos de la estructura PRINTDLG en campos de una estructura de datos definida por el programa.

    Después de almacenar los datos de la estructura PRINTDLG en la estructura de datos del programa, puede abrir el cuadro de diálogo progreso de impresión. El procedimiento del cuadro de diálogo progreso de impresión controla los mensajes del cuadro de diálogo e inicia el subproceso de procesamiento de impresión.

    En el ejemplo de código siguiente se muestra cómo copiar los datos de la estructura PRINTDLG en la estructura de datos del programa y cómo iniciar el trabajo de impresión.

    // 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. Si el usuario hace clic en el botón Cancelar en el cuadro de diálogo Imprimir común, no se realiza ningún procesamiento adicional.