Partager via


Procédure : récupérer un contexte de périphérique d’imprimante

Cette rubrique explique comment récupérer un contexte de périphérique d’imprimante. Vous pouvez récupérer un contexte de périphérique d’imprimante en appelant directement la fonction CreateDC , ou il peut être retourné par une boîte de dialogue Imprimer commune.

Lorsque vous affichez une boîte de dialogue Imprimer commune, l’utilisateur peut sélectionner l’imprimante, les pages du document et le nombre de copies de document qu’il souhaite imprimer. La boîte de dialogue Imprimer commune retourne ces sélections dans une structure de données.

Cette rubrique explique comment obtenir un contexte de périphérique d’imprimante à l’aide des méthodes suivantes.

Appeler CreateDC

Si vous connaissez l’appareil sur lequel vous souhaitez imprimer, vous pouvez appeler CreateDC et passer ces informations directement à la fonction. CreateDC retourne un contexte d’appareil dans lequel vous pouvez afficher le contenu à imprimer.

L’appel le plus simple pour récupérer un contexte d’appareil est illustré dans l’exemple de code qui suit. Le code de cet exemple récupère un contexte d’appareil sur le périphérique d’affichage par défaut.

    hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

Pour effectuer le rendu sur une imprimante spécifique, vous devez spécifier « WINSPOOL » comme appareil et passer le nom correct de l’imprimante à CreateDC. Vous pouvez également passer une structure DEVMODE dans l’appel à CreateDC si vous souhaitez fournir des données d’initialisation spécifiques au périphérique pour le pilote de périphérique lorsque vous créez le contexte de périphérique.

L’exemple suivant montre un appel à CreateDC dans lequel le pilote « WINSPOOL » est sélectionné et le nom de l’imprimante est spécifié par son nom.

    printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);

Vous pouvez obtenir la chaîne de nom d’imprimante exacte à passer à CreateDC en appelant la fonction EnumPrinters . L’exemple de code suivant montre comment appeler EnumPrinters et obtenir les noms des imprimantes locales et connectées localement. Étant donné que la taille de la mémoire tampon requise ne peut pas être connue à l’avance, les EnumPrinters sont appelés deux fois. Le premier appel retourne la taille de la mémoire tampon requise. Ces informations sont utilisées pour allouer une mémoire tampon de la taille requise, et le deuxième appel à EnumPrinters retourne les données souhaitées.

    fnReturn = EnumPrinters(
                PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
                NULL,
                1L,                // printer info level
                (LPBYTE)NULL,
                0L,
                &dwNeeded,
                &dwReturned);
    
    if (dwNeeded > 0)
    {
        pInfo = (PRINTER_INFO_1 *)HeapAlloc(
                    GetProcessHeap(), 0L, dwNeeded);
    }

    if (NULL != pInfo)
    {
        dwReturned = 0;
        fnReturn = EnumPrinters(
                PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
                NULL,
                1L,                // printer info level
                (LPBYTE)pInfo,
                dwNeeded,
                &dwNeeded,
                &dwReturned);
    }

    if (fnReturn)
    {
        // Review the information from all the printers
        //  returned by EnumPrinters.
        for (i=0; i < dwReturned; i++)
        {
            // pThisInfo[i]->pName contains the printer
            //  name to use in the CreateDC function call.
            //
            // When this desired printer is found in the list of
            //  returned printer, set the printerName value to 
            //  use in the call to CreateDC.

            // printerName = pThisInfo[i]->pName
        }
    }

Afficher une boîte de dialogue Commune d’impression

Vous pouvez choisir entre deux boîtes de dialogue Imprimer communes à afficher à un utilisateur ; la boîte de dialogue la plus récente, que vous pouvez afficher en appelant la fonction PrintDlgEx , et la boîte de dialogue de style plus ancienne, que vous pouvez afficher en appelant la fonction PrintDlg . Les sections suivantes décrivent comment appeler chaque boîte de dialogue à partir d’une application.

Utilisation de la fonction PrintDlgEx

Appelez la fonction PrintDlgEx pour afficher la feuille de propriétés Imprimer . À l’aide de la feuille de propriétés, l’utilisateur peut spécifier des informations sur le travail d’impression. Par exemple, l’utilisateur peut sélectionner une plage de pages à imprimer, le nombre de copies, etc. PrintDlgEx peut également récupérer un handle dans un contexte d’appareil pour l’imprimante sélectionnée. Vous pouvez utiliser le handle pour afficher la sortie sur l’imprimante.

Pour obtenir un exemple de code illustrant l’utilisation de PrintDlgEx pour récupérer un contexte de périphérique d’imprimante, consultez « Utilisation de la feuille de propriétés d’impression » dans Utilisation de boîtes de dialogue communes.

Utilisation de la fonction PrintDlg

Si votre application doit s’exécuter sur un système qui ne prend pas en charge la fonction PrintDlgEx , par exemple sur un système qui exécute une version de Windows antérieure à Windows 2000, ou si elle n’a pas besoin des fonctionnalités supplémentaires fournies par la fonction PrintDlgEx , utilisez la fonction PrintDlg . Les étapes suivantes décrivent comment afficher l’ancienne boîte de dialogue Imprimer commune.

  1. Initialisez la structure de données PRINTDLG .
  2. Appelez PrintDlg pour afficher la boîte de dialogue Imprimer commune à l’utilisateur.
  3. Si l’appel PrintDlg retourne TRUE, verrouillez la mémoire de structure DEVMODE retournée. Si l’appel PrintDlg renvoie FALSE, l’utilisateur a appuyé sur le bouton Annuler dans la boîte de dialogue Imprimer commune pour qu’il n’y ait plus rien à traiter.
  4. Allouez une mémoire tampon locale suffisamment grande pour contenir une copie de la structure DEVMODE .
  5. Copiez la structure DEVMODE retournée dans la structure allouée localement.
  6. Enregistrez les autres informations retournées dans la structure PRINTDLG et dont vous aurez besoin pour traiter le travail d’impression.
  7. Libérez le PRINTDLG et les mémoires tampons qu’il référence.

L’exemple de code suivant montre comment utiliser la fonction PrintDlg pour obtenir le contexte de l’appareil et le nom de l’imprimante sélectionnée.

// Display the printer dialog box so the user can select the 
//  printer and the number of copies to print.
BOOL            printDlgReturn = FALSE;
HDC                printerDC = NULL;
PRINTDLG        printDlgInfo = {0};
LPWSTR            localPrinterName = NULL;
PDEVMODE        returnedDevmode = NULL;
PDEVMODE        localDevmode = NULL;
int                localNumberOfCopies = 0;

// Initialize the print dialog box's data structure.
printDlgInfo.lStructSize = sizeof( printDlgInfo );
printDlgInfo.Flags = 
    // Return a printer device context.
    PD_RETURNDC 
    // Don't allow separate print to file.
    // Remove these flags if you want to support this feature.
    | PD_HIDEPRINTTOFILE        
    | PD_DISABLEPRINTTOFILE 
    // Don't allow selecting individual document pages to print.
    // Remove this flag if you want to support this feature.
    | PD_NOSELECTION;

// Display the printer dialog and retrieve the printer DC.
printDlgReturn = PrintDlg(&printDlgInfo);

// Check the return value.
if (TRUE == printDlgReturn)
{
    // The user clicked OK so the printer dialog box data 
    //  structure was returned with the user's selections.
    //  Copy the relevant data from the data structure and 
    //  save them to a local data structure.

    //
    // Get the HDC of the selected printer
    printerDC = printDlgInfo.hDC;
    
    // In this example, the DEVMODE structure returned by 
    //    the printer dialog box is copied to a local memory
    //    block and a pointer to the printer name that is 
    //    stored in the copied DEVMODE structure is saved.

    //
    //  Lock the handle to get a pointer to the DEVMODE structure.
    returnedDevmode = (PDEVMODE)GlobalLock(printDlgInfo.hDevMode);

    localDevmode = (LPDEVMODE)HeapAlloc(
                        GetProcessHeap(), 
                        HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, 
                        returnedDevmode->dmSize);

    if (NULL != localDevmode) 
    {
        memcpy(
            (LPVOID)localDevmode,
            (LPVOID)returnedDevmode, 
            returnedDevmode->dmSize);

        // Save the printer name from the DEVMODE structure.
        //  This is done here just to illustrate how to access
        //  the name field. The printer name can also be accessed
        //  by referring to the dmDeviceName in the local 
        //  copy of the DEVMODE structure.
        localPrinterName = localDevmode->dmDeviceName;

        // Save the number of copies as entered by the user
        localNumberOfCopies = printDlgInfo.nCopies;    
    }
    else
    {
        // Unable to allocate a new structure so leave
        //  the pointer as NULL to indicate that it's empty.
    }

    // Free the DEVMODE structure returned by the print 
    //  dialog box.
    if (NULL != printDlgInfo.hDevMode) 
    {
        GlobalFree(printDlgInfo.hDevMode);
    }
}
else
{
    // The user cancelled out of the print dialog box.
}

Pour plus d’informations sur la fonction PrintDlg , consultez « Affichage de la boîte de dialogue Imprimer » dans Utilisation de boîtes de dialogue communes.