Hoe de context van een printerapparaat ophalen

In dit onderwerp wordt beschreven hoe u een context van een printerapparaat ophaalt. U kunt een context van een printerapparaat ophalen door de functie CreateDC- rechtstreeks aan te roepen, of het kan worden geretourneerd door een algemeen -dialoogvenster Afdrukken.

Wanneer u een Dialoogvenster Afdrukken algemene dialoogvenster weergeeft, kunnen gebruikers de printer, de pagina's van het document en het aantal exemplaren van het document selecteren dat ze willen afdrukken. Het algemene dialoogvenster Afdrukken geeft deze selecties terug in een gegevensstructuur.

In dit onderwerp wordt beschreven hoe u een printerapparaatcontext kunt verkrijgen met behulp van de volgende methoden.

CreateDC aanroepen

Als u weet welk apparaat u wilt afdrukken, kunt u CreateDC- aanroepen en die informatie rechtstreeks doorgeven aan de functie. CreateDC- retourneert een apparaatcontext waarin u de inhoud kunt weergeven om af te drukken.

De eenvoudigste aanroep om een apparaatcontext op te halen, wordt weergegeven in het codevoorbeeld dat volgt. Met de code in dit voorbeeld wordt een apparaatcontext opgehaald naar het standaardweergaveapparaat.

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

Als u op een specifieke printer wilt afdrukken, moet u WINSPOOL opgeven als het apparaat en de juiste naam van de printer doorgeven aan CreateDC. U kunt ook een DEVMODE- structuur doorgeven in de aanroep naar CreateDC- als u apparaatspecifieke initialisatiegegevens voor het apparaatstuurprogramma wilt opgeven wanneer u de apparaatcontext maakt.

In het volgende voorbeeld ziet u een aanroep naar CreateDC- waarin het stuurprogramma WINSPOOL is geselecteerd en de printernaam op naam is opgegeven.

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

U kunt de exacte tekenreeks van de printernaam verkrijgen om door te geven aan CreateDC door de functie EnumPrinters aan te roepen. In het volgende codevoorbeeld ziet u hoe u EnumPrinters aanroept en de namen opkrijgt van de lokale en lokaal verbonden printers. Omdat de grootte van de vereiste buffer niet vooraf bekend is, wordt de EnumPrinters twee keer aangeroepen. De eerste aanroep retourneert de grootte van de vereiste buffer. Deze informatie wordt gebruikt om een buffer van de vereiste grootte toe te wijzen en de tweede aanroep naar EnumPrinters retourneert de gewenste gegevens.

    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
        }
    }

Een algemeen dialoogvenster Afdrukken weergeven

U kunt kiezen uit twee Print dialoogvensters om weer te geven aan een gebruiker; het nieuwere dialoogvenster, dat u kunt weergeven door de functie PrintDlgEx aan te roepen, en het oudere-stijl dialoogvenster, dat u kunt weergeven door de functie PrintDlg aan te roepen. In de volgende secties wordt beschreven hoe u elk dialoogvenster aanroept vanuit een toepassing.

De functie PrintDlgEx gebruiken

Roep de functie PrintDlgEx aan om het eigenschappenvenster Afdrukken weer te geven. Met behulp van het eigenschappenvenster kan de gebruiker informatie over de afdruktaak opgeven. De gebruiker kan bijvoorbeeld een reeks pagina's selecteren die moeten worden afgedrukt, het aantal exemplaren enzovoort. De PrintDlgEx- kan ook een handle ophalen voor een apparaatcontext voor de geselecteerde printer. U kunt de greep gebruiken om uitvoer weer te geven op de printer.

Zie 'Using the Print Property Sheet' in Using Common Dialog Boxesvoor voorbeeldcode die het gebruik van PrintDlgEx illustreert om een printerapparaatcontext op te halen.

De functie PrintDlg gebruiken

Als uw toepassing moet worden uitgevoerd op een systeem dat geen ondersteuning biedt voor de functie PrintDlgEx, zoals op een systeem waarop een versie van Windows ouder dan Windows 2000 wordt uitgevoerd, of die geen extra functionaliteit nodig heeft die de functie PrintDlgEx biedt, gebruikt u de functie PrintDlg. In de volgende stappen wordt beschreven hoe u de oudere stijl Afdruk algemene dialoogvenster kunt weergeven.

  1. Initialiseer de PRINTDLG gegevensstructuur.
  2. Roep PrintDlg- aan om het algemene dialoogvenster Afdrukken weer te geven aan de gebruiker.
  3. Als de PrintDlg-aanroep TRUE-retourneert, moet het geretourneerde DEVMODE structuurgeheugen vergrendeld worden. Als de PrintDlg--aanroep ONWAARis, heeft de gebruiker op de knop Annuleren gedrukt in het algemeen dialoogvenster Afdrukken, dus er hoeft niets meer verwerkt te worden.
  4. Wijs een lokale geheugenbuffer toe die groot genoeg is om een kopie van de DEVMODE structuur te bevatten.
  5. Kopieer de geretourneerde DEVMODE structuur naar de lokaal toegewezen structuur.
  6. Sla andere informatie op die wordt geretourneerd in de PRINTDLG- structuur en die u nodig hebt om de afdruktaak te verwerken.
  7. Maak de PRINTDLG- vrij en bevrijd de geheugengebieden waarnaar het verwijst.

In de volgende voorbeeldcode ziet u hoe u de functie PrintDlg gebruikt om de apparaatcontext en de naam van de geselecteerde printer op te halen.

// 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.
}

Raadpleeg voor meer informatie over de PrintDlg functie, "Het dialoogvenster Afdrukken weergeven" in Veelgebruikte dialoogvensters.