Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird beschrieben, wie Druckauftragsinformationen vom Benutzer gesammelt werden.
Überblick
Sammeln Sie Druckauftragsinformationen vom Benutzer, indem Sie die PrintDlg-Funktion aufrufen. Diese Funktion zeigt dem Benutzer das allgemeine Dialogfeld " Drucken " an und gibt die Druckauftragsinformationen in einer PRINTDLG-Datenstruktur zurück.
Das allgemeine Dialogfeld " Drucken " wird angezeigt, wenn der Benutzer einen Druckauftrag startet. Das allgemeine Dialogfeld "Drucken" ist ein modales Dialogfeld, was bedeutet, dass der Benutzer erst dann mit dem Hauptfenster interagieren kann, wenn das allgemeine Dialogfeld geschlossen wird.
Sammeln von Druckauftragsinformationen
Initialisieren Sie das PRINTDLG-Strukturelement .
Bevor ein Programm das allgemeine Dialogfeld "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;Zeigt das allgemeine Dialogfeld "Drucken " an.
Rufen Sie PrintDlg mit der initialisierten PRINTDLG-Struktur auf, um das allgemeine Dialogfeld " Drucken " anzuzeigen und die Benutzerdaten zu sammeln, wie im folgenden Codebeispiel gezeigt.
// Display the printer dialog and retrieve the printer DC pdReturn = PrintDlg(&pd);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 Dialogfeld "Drucken" vorgenommen hat. Einige Elemente der PRINTDLG-Struktur sind Handles für globale Speicherobjekte. Das Print Sample Program kopiert die Daten aus den globalen Speicherobjekten in Speicherblöcke, die das Programm verwaltet, und kopiert andere Felder aus der PRINTDLG-Struktur in Felder in einer Datenstruktur, die das Programm definiert hat.
Nachdem Sie die Daten aus der PRINTDLG-Struktur in der Datenstruktur des Programms gespeichert haben, können Sie das Dialogfeld "Druckfortschritt" öffnen. Die Prozedur des Dialogfelds "Druckfortschritt" behandelt die Dialogfeldmeldungen und startet den Druckverarbeitungsthread.
Das folgende Codebeispiel zeigt, wie die Daten aus der PRINTDLG-Struktur in die Datenstruktur des Programms kopiert und wie der Druckauftrag gestartet wird.
// 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);Wenn der Benutzer im allgemeinen Dialogfeld "Drucken" auf die Schaltfläche "Abbrechen" klickt, wird keine weitere Verarbeitung ausgeführt.