Guide pratique pour collecter des informations sur le travail d’impression auprès de l’utilisateur

Cette rubrique explique comment collecter des informations sur le travail d’impression auprès de l’utilisateur.

Vue d’ensemble

Collectez les informations de travail d’impression de l’utilisateur en appelant la fonction PrintDlg . Cette fonction affiche la boîte de dialogue Imprimer commun à l’utilisateur et retourne les informations de travail d’impression dans une structure de données PRINTDLG .

La boîte de dialogue Imprimer courant s’affiche lorsque l’utilisateur démarre un travail d’impression. La boîte de dialogue Imprimer commun est une boîte de dialogue modale, ce qui signifie que l’utilisateur ne peut pas interagir avec la fenêtre main tant que la boîte de dialogue commune n’est pas fermée.

Collecte d’informations sur le travail d’impression

  1. Initialisez l’élément de structure PRINTDLG .

    Avant qu’un programme puisse afficher la boîte de dialogue Imprimer commun , il doit allouer et initialiser une structure PRINTDLG . Il transmet ensuite cette structure à la fonction PrintDlg , qui affiche la boîte de dialogue et retourne les données du travail d’impression dans la même structure. L’exemple de code suivant montre comment l’exemple de programme effectue cette étape.

    // 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. Affichez la boîte de dialogue Imprimer commun.

    Appelez PrintDlg avec la structure PRINTDLG initialisée pour afficher la boîte de dialogue Imprimer commun et collecter les données utilisateur, comme illustré dans l’exemple de code suivant.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Enregistrez les champs de la structure PRINTDLG et démarrez le travail d’impression.

    La structure PRINTDLG contient les données qui décrivent les sélections effectuées par l’utilisateur dans la boîte de dialogue d’impression. Certains membres de la structure PRINTDLG sont des handles vers des objets de mémoire globale. L’exemple de programme d’impression copie les données des objets de mémoire globale dans des blocs de mémoire que le programme gère et copie d’autres champs de la structure PRINTDLG vers des champs d’une structure de données définie par le programme.

    Après avoir stocker les données de la structure PRINTDLG dans la structure de données du programme, vous pouvez ouvrir la boîte de dialogue Progression de l’impression. La procédure de boîte de dialogue progression de l’impression gère les messages de boîte de dialogue et démarre le thread de traitement d’impression.

    L’exemple de code suivant montre comment copier les données de la structure PRINTDLG vers la structure de données du programme et comment démarrer le travail d’impression.

    // 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 l’utilisateur clique sur le bouton Annuler dans la boîte de dialogue Imprimer commun, aucun traitement supplémentaire n’est effectué.