Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano sposób zbierania informacji o zadaniu drukowania od użytkownika.
Przegląd
Zbierz informacje o zadaniu drukowania od użytkownika, wywołując funkcję PrintDlg. Ta funkcja wyświetla użytkownikowi typowe okno dialogowe Print i zwraca informacje o zadaniu drukowania w strukturze danych PRINTDLG.
Okno dialogowe drukowania jest wyświetlane, gdy użytkownik uruchamia zadanie drukowania. Drukuj wspólne okno dialogowe to modalne okno dialogowe, co oznacza, że użytkownik nie może wchodzić w interakcje z głównym oknem, dopóki wspólne okno dialogowe nie zostanie zamknięte.
Zbieranie informacji o zleceniach druku
Zainicjuj element struktury PRINTDLG.
Zanim program będzie mógł wyświetlić wspólne okno dialogowe Print , musi przydzielić i zainicjować strukturę PRINTDLG. Następnie przekazuje tę strukturę do funkcji PrintDlg, która wyświetla okno dialogowe i zwraca dane zadania drukowania w tej samej strukturze. Poniższy przykład kodu pokazuje, jak przykładowy program wykonuje ten krok.
// 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;Wyświetl typowe okno dialogowe Drukuj.
Wywołaj PrintDlg za pomocą zainicjowanej struktury PRINTDLG, aby wyświetlić Print typowe okno dialogowe i zebrać dane użytkownika, jak pokazano w poniższym przykładzie kodu.
// Display the printer dialog and retrieve the printer DC pdReturn = PrintDlg(&pd);Zapisz pola ze struktury PRINTDLG i uruchom zadanie drukowania.
Struktura PRINTDLG zawiera dane opisujące wybory wprowadzone przez użytkownika w oknie dialogowym drukowania. Niektóre elementy członkowskie struktury PRINTDLG są uchwytami na obiekty pamięci globalnej. Print Sample Program kopiuje dane z obiektów pamięci globalnej do pamięci bloków, którymi program zarządza i kopiuje inne pola ze struktury PRINTDLG do pól w strukturze danych zdefiniowanej przez program.
Po przechowywaniu danych ze struktury PRINTDLG w strukturze danych programu można otworzyć okno dialogowe postępu drukowania. Procedura okna dialogowego postępu drukowania obsługuje komunikaty okna dialogowego i uruchamia wątek przetwarzania wydruku.
Poniższy przykład kodu pokazuje, jak skopiować dane z PRINTDLG struktury danych programu i jak uruchomić zadanie drukowania.
// 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);Jeśli użytkownik kliknie przycisk Anuluj w standardowym oknie dialogowym Drukuj, nie nastąpi dalsze przetwarzanie.