Procedura: Raccogliere informazioni sul processo di stampa dall'utente

Questo argomento descrive come raccogliere informazioni sul processo di stampa dall'utente.

Panoramica

Raccogliere le informazioni sul processo di stampa dall'utente chiamando la funzione PrintDlg . Questa funzione visualizza la finestra di dialogo Stampa comune all'utente e restituisce le informazioni sul processo di stampa in una struttura di dati PRINTDLG .

La finestra di dialogo Stampa comune viene visualizzata quando l'utente avvia un processo di stampa. La finestra di dialogo Stampa comune è una finestra di dialogo modale, che significa che l'utente non può interagire con la finestra principale fino a quando non viene chiusa la finestra di dialogo comune.

Raccolta di informazioni sul processo di stampa

  1. Inizializzare l'elemento struttura PRINTDLG .

    Prima che un programma possa visualizzare la finestra di dialogo Stampa comune , deve allocare e inizializzare una struttura PRINTDLG . Passa quindi questa struttura alla funzione PrintDlg , che visualizza la finestra di dialogo e restituisce i dati del processo di stampa nella stessa struttura. Nell'esempio di codice seguente viene illustrato come il programma di esempio esegue questo passaggio.

    // 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. Visualizzare la finestra di dialogo Stampa comune.

    Chiamare PrintDlg con la struttura PRINTDLG inizializzata per visualizzare la finestra di dialogo Stampa comune e raccogliere i dati utente, come illustrato nell'esempio di codice seguente.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Salvare i campi dalla struttura PRINTDLG e avviare il processo di stampa.

    La struttura PRINTDLG contiene i dati che descrivono le selezioni effettuate dall'utente nella finestra di dialogo di stampa. Alcuni membri della struttura PRINTDLG sono handle per gli oggetti di memoria globale. Il Programma di esempio di stampa copia i dati dagli oggetti di memoria globali in blocchi di memoria gestiti dal programma e copia altri campi dalla struttura PRINTDLG ai campi in una struttura di dati definita dal programma.

    Dopo aver archiviato i dati dalla struttura PRINTDLG nella struttura dei dati del programma, è possibile aprire la finestra di dialogo stato stampa. La finestra di dialogo stato stampa gestisce i messaggi della finestra di dialogo e avvia il thread di elaborazione di stampa.

    Nell'esempio di codice seguente viene illustrato come copiare i dati dalla struttura PRINTDLG alla struttura dei dati del programma e come avviare il processo di stampa.

    // 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 l'utente fa clic sul pulsante Annulla nella finestra di dialogo Stampa comune, non viene eseguita ulteriore elaborazione.