Vorgehensweise: Sammeln von Druckauftragsinformationen vom Benutzer

In diesem Thema wird beschrieben, wie Sie Druckauftragsinformationen vom Benutzer sammeln.

Übersicht

Sammeln Sie Druckauftragsinformationen vom Benutzer, indem Sie die PrintDlg-Funktion aufrufen. Diese Funktion zeigt dem Benutzer das Dialogfeld Gemeinsames Drucken an und gibt die Druckauftragsinformationen in einer PRINTDLG-Datenstruktur zurück.

Das Dialogfeld Gemeinsames Drucken wird angezeigt, wenn der Benutzer einen Druckauftrag startet. Das Dialogfeld Gemeinsames Drucken ist ein modales Dialogfeld, was bedeutet, dass der Benutzer erst mit dem Standard Fenster interagieren kann, wenn das allgemeine Dialogfeld geschlossen wird.

Sammeln von Druckauftragsinformationen

  1. Initialisieren Sie das PRINTDLG-Strukturelement .

    Bevor ein Programm das Dialogfeld Gemeinsames Drucken anzeigen kann, muss es eine PRINTDLG-Struktur zuordnen und initialisieren. Anschließend wird diese Struktur an die PrintDlg-Funktion übergeben, die das Dialogfeld anzeigt und die Druckauftragsdaten in derselben Struktur zurückgibt. Das folgende Codebeispiel zeigt, wie das Beispielprogramm diesen Schritt ausführt.

    // 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. Zeigen Sie das Dialogfeld Gemeinsames Drucken an.

    Rufen Sie PrintDlg mit der initialisierten PRINTDLG-Struktur auf, um das Dialogfeld Gemeinsames Drucken anzuzeigen und die Benutzerdaten zu sammeln, wie im folgenden Codebeispiel gezeigt.

    // Display the printer dialog and retrieve the printer DC
    pdReturn = PrintDlg(&pd);
    
  3. Speichern Sie die Felder aus der PRINTDLG-Struktur , und starten Sie den Druckauftrag.

    Die PRINTDLG-Struktur enthält die Daten, die die Auswahl beschreiben, die der Benutzer im Druckdialogfeld vorgenommen hat. Einige Member der PRINTDLG-Struktur sind Handles für globale Speicherobjekte. Das Druckbeispielprogramm kopiert die Daten aus den globalen Speicherobjekten in Speicherblöcke, die vom Programm verwaltet werden, und kopiert andere Felder aus der PRINTDLG-Struktur in Felder in einer Vom Programm definierten Datenstruktur.

    Nachdem Sie die Daten aus der PRINTDLG-Struktur in der Datenstruktur des Programms gespeichert haben, können Sie das Dialogfeld Druckstatus öffnen. Die Druckstatusdialogfeldprozedur verarbeitet die Dialogfeldmeldungen und startet den Druckverarbeitungsthread.

    Das folgende Codebeispiel zeigt, wie Sie die Daten aus der PRINTDLG-Struktur in die Datenstruktur des Programms kopieren und den Druckauftrag starten.

    // 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. Wenn der Benutzer im Dialogfeld Gemeinsames Drucken auf die Schaltfläche Abbrechen klickt, wird keine weitere Verarbeitung durchgeführt.