Udostępnij za pośrednictwem


Jak Zbierać Informacje o Zadaniu Drukowania od Użytkownika

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

  1. 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;
    
  2. 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);
    
  3. 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);
    
  4. Jeśli użytkownik kliknie przycisk Anuluj w standardowym oknie dialogowym Drukuj, nie nastąpi dalsze przetwarzanie.