Procedure: Afdruktaakgegevens van de gebruiker verzamelen

In dit onderwerp wordt beschreven hoe u afdruktaakgegevens van de gebruiker verzamelt.

Overzicht

Verzamel afdruktaakgegevens van de gebruiker door de functie PrintDlg aan te roepen. Met deze functie wordt het algemene dialoogvenster Afdrukken voor de gebruiker weergegeven en worden de afdruktaakgegevens in een PRINTDLG- gegevensstructuur geretourneerd.

Het algemene Afdrukken dialoogvenster wordt weergegeven wanneer de gebruiker een afdruktaak start. Het dialoogvenster Afdrukken algemene dialoogvenster is een modaal dialoogvenster. Dit betekent dat de gebruiker pas met het hoofdvenster kan communiceren als het algemene dialoogvenster is gesloten.

Informatie over afdruktaak verzamelen

  1. Initialiseer het structuurelement van PRINTDLG.

    Voordat een programma het Afdrukken dialoogvenster kan weergeven, moet een PRINTDLG-structuur worden toegewezen en geïnitialiseerd. Vervolgens wordt deze structuur doorgegeven aan de functie PrintDlg, waarin het dialoogvenster wordt weergegeven en de afdruktaakgegevens in dezelfde structuur worden geretourneerd. In het volgende codevoorbeeld ziet u hoe deze stap wordt uitgevoerd door het voorbeeldprogramma.

    // 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. Het algemene dialoogvenster Afdrukken weergeven.

    Roep PrintDlg- aan met de geïnitialiseerde PRINTDLG structuur om het algemene dialoogvenster Afdrukken algemene dialoogvenster weer te geven en de gebruikersgegevens te verzamelen, zoals wordt weergegeven in het volgende codevoorbeeld.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Sla de velden op uit de PRINTDLG structuur en start de afdruktaak.

    De PRINTDLG structuur bevat de gegevens die de gebruiker in het afdrukdialoogvenster heeft geselecteerd. Sommige leden van de PRINTDLG structuur zijn ingangen voor globale geheugenobjecten. De Print Sample Program kopieert de gegevens van de globale geheugenobjecten naar geheugenblokken die het programma beheert en kopieert andere velden uit de PRINTDLG structuur naar velden in een gegevensstructuur die door het programma is gedefinieerd.

    Nadat u de gegevens uit de PRINTDLG structuur hebt opgeslagen in de gegevensstructuur van het programma, kunt u het dialoogvenster afdrukvoortgang openen. De procedure voor het afdrukvoortgangsdialoogvenster verwerkt de berichten in het dialoogvenster en start de afdrukverwerkingsthread.

    In het volgende codevoorbeeld ziet u hoe u de gegevens kopieert uit de PRINTDLG- structuur naar de gegevensstructuur van het programma en hoe u de afdruktaak start.

    // 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. Als de gebruiker op de knop Annuleren klikt in het dialoogvenster Afdrukken algemene dialoogvenster, wordt er geen verdere verwerking uitgevoerd.