Udostępnij przez


TN030: dostosowywanie drukowania i podglądu wydruku

Uwaga / Notatka

Następująca uwaga techniczna nie została zaktualizowana, ponieważ została po raz pierwszy uwzględniona w dokumentacji online. W związku z tym niektóre procedury i tematy mogą być nieaktualne lub nieprawidłowe. Aby uzyskać najnowsze informacje, zaleca się wyszukanie interesującego tematu w indeksie dokumentacji online.

W tej notatce opisano proces dostosowywania podglądu wydruku i drukowania oraz cele procedur wywołania zwrotnego używanych w CView oraz procedur wywołania zwrotnego i funkcji składowych CPreviewView.

Problem

MFC zapewnia kompletne rozwiązanie dla większości potrzeb w zakresie drukowania i drukowania w wersji zapoznawczej. W większości przypadków wymagany jest niewielki dodatkowy kod, aby widok był zdolny do drukowania i podglądu. Istnieją jednak sposoby optymalizacji drukowania, które wymagają znacznego nakładu pracy ze strony dewelopera, a niektóre aplikacje muszą dodać określone elementy interfejsu użytkownika do trybu podglądu wydruku.

Wydajne drukowanie

Gdy aplikacja MFC drukuje przy użyciu standardowych metod, system Windows kieruje wszystkie wywołania wyjściowe interfejsu graficznego urządzenia (GDI) do metapliku w pamięci. Po EndPage wywołaniu system Windows odtwarza metaplik raz dla każdego fizycznego pasma wymaganego przez drukarkę do wydrukowania jednej strony. Podczas renderowania interfejs GDI często wykonuje zapytanie względem procedury przerwania, aby określić, czy powinna ona być kontynuowana. Zazwyczaj procedura przerwania umożliwia przetwarzanie komunikatów, aby użytkownik mógł przerwać zadanie drukowania przy użyciu okna dialogowego drukowania.

Niestety, może to spowolnić proces drukowania. Jeśli drukowanie w aplikacji musi być szybsze niż można osiągnąć przy użyciu standardowej techniki, należy zaimplementować ręczne łączenie.

Aby ręcznie podzielić na pasy, pętla drukowania powinna być ponownie zaimplementowana w taki sposób, aby OnPrint było wywoływane wielokrotnie na stronę (raz na pas). Pętla drukowania jest implementowana w funkcji OnFilePrint w viewprnt.cpp. W swojej klasie pochodnej przeciążasz tę funkcję, aby wpis w mapie komunikatów, który obsługuje polecenie drukowania, wywołuje Twoją funkcję drukowania. Skopiuj procedurę OnFilePrint i zmień pętlę drukowania, aby zaimplementować banding. Prawdopodobnie będziesz chciał również przekazać prostokąt pasmowy do swoich funkcji drukowania, aby można było zoptymalizować rysunek w oparciu o sekcję drukowanej strony.

Po drugie, należy często wywoływać QueryAbort podczas rysowania pasma. W przeciwnym razie procedura przerwania nie zostanie wywołana, a użytkownik nie będzie mógł anulować zadania drukowania.

Podgląd wydruku, w istocie, próbuje przekształcić wyświetlacz w emulację drukarki. Domyślnie obszar klienta okna głównego służy do wyświetlania jednej lub dwóch stron w pełni w oknie. Użytkownik może powiększyć obszar strony, aby zobaczyć go bardziej szczegółowo. Dzięki dodatkowej obsłudze użytkownik może nawet mieć możliwość edytowania dokumentu w trybie podglądu.

Dostosowywanie podglądu wydruku

Ta uwaga dotyczy tylko jednego aspektu modyfikowania podglądu wydruku: dodawanie interfejsu użytkownika do trybu podglądu. Inne modyfikacje są możliwe, ale takie zmiany nie należą do zakresu tej dyskusji.

Aby dodać interfejs użytkownika do trybu podglądu

  1. Odprowadź klasę widoku z klasy CPreviewView.

  2. Dodaj programy obsługi poleceń dla pożądanych aspektów interfejsu użytkownika.

  3. Jeśli dodasz aspekty wizualne do wyświetlania, przesłoń OnDraw i wykonaj rysunek po wywołaniu metody CPreviewView::OnDraw.

OnFilePrintPreview

To jest obsługiwacz poleceń dla podglądu wydruku. Jego domyślna implementacja to:

void CView::OnFilePrintPreview()
{
    // In derived classes, implement special window handling here
    // Be sure to Unhook Frame Window close if hooked.

    // must not create this on the frame. Must outlive this function
    CPrintPreviewState* pState = new CPrintPreviewState;

    if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
        RUNTIME_CLASS(CPreviewView), pState))
    {
        // In derived classes, reverse special window handling
        // here for Preview failure case

        TRACE0("Error: DoPrintPreview failed");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        delete pState;  // preview failed to initialize, delete State now
    }
}

DoPrintPreview spowoduje ukrycie głównego okienka aplikacji. Paski sterowania, takie jak pasek stanu, można zachować, określając je w elemencie > (jest to maska bitowa, a bity poszczególnych pasków sterowania są definiowane przez AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)). Okno > to okno, które zostanie automatycznie ukryte i ponownie wyświetlone. DoPrintPreview Następnie utworzy pasek przycisku dla standardowego interfejsu użytkownika w wersji zapoznawczej. Jeśli wymagana jest specjalna obsługa okien, na przykład w celu ukrycia lub wyświetlenia innych okien, należy to zrobić przed wywołaniem DoPrintPreview.

Domyślnie po zakończeniu podglądu wydruku przywraca paski kontrolek do ich oryginalnych stanów oraz sprawia, że okienko główne jest na nowo widoczne. Jeśli wymagana jest specjalna obsługa, należy ją zrealizować poprzez przesłonięcie elementu EndPrintPreview. W przypadku DoPrintPreview awarii należy również zapewnić specjalną obsługę.

DoPrintPreview jest wywoływana za pomocą polecenia:

  • Identyfikator zasobu szablonu okna dialogowego dla paska narzędzi podglądowego.

  • Wskaźnik do widoku w celu przygotowania podglądu wydruku do drukowania.

  • Klasa czasu wykonywania klasy Widok wersji zapoznawczej. Zostanie ona dynamicznie utworzona w aplikacji DoPrintPreview.

  • Wskaźnik CPrintPreviewState. Należy pamiętać, że struktura CPrintPreviewState (lub struktura pochodna, jeśli aplikacja potrzebuje więcej stanu zachowanego) nie może być tworzona w ramce. DoPrintPreview działa w trybie bezdialogowym i ta struktura musi przetrwać do momentu wywołania EndPrintPreview.

    Uwaga / Notatka

    Jeśli do obsługi drukowania jest wymagana oddzielna klasa lub widok, wskaźnik do tego obiektu powinien zostać przekazany jako drugi argument.

Zakończ Podgląd Druku

Jest to wywoływane w celu zakończenia trybu podglądu wydruku. Często pożądane jest przejście do strony w dokumencie, który był ostatnio wyświetlany w podglądzie wydruku. EndPrintPreview jest to szansa aplikacji na to. Członek pInfo->m_nCurPage to strona, która była ostatnio wyświetlana (lewa, jeśli wyświetlano dwie strony), a wskaźnik wskazuje miejsce na stronie, które interesowało użytkownika. Ponieważ struktura widoku aplikacji jest nieznana dla frameworku, musisz podać kod, który pozwoli przejść do wybranego punktu.

Przed wywołaniem metody CView::EndPrintPreviewnależy wykonać większość akcji. To wywołanie odwraca efekty DoPrintPreview i usuwa elementy pView, pDC i pInfo.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

Musi to być zamapowane na element menu Ustawienia wydruku. W większości przypadków nie jest konieczne zastąpienie implementacji.

Nomenklatura stron

Innym problemem jest numerowanie i kolejność stron. W przypadku prostych aplikacji typu word processor jest to prosty problem. Większość systemów podglądu wydruku zakłada, że każda wydrukowana strona odpowiada jednej stronie w dokumencie.

Podczas próby udostępnienia uogólnionego rozwiązania należy wziąć pod uwagę kilka kwestii. Wyobraź sobie system CAD. Użytkownik ma rysunek, który obejmuje kilka arkuszy o rozmiarze E. W przypadku ploterów formatu E (lub mniejszych, skalowanych) numeracja stron byłaby taka sama, jak w prostym przypadku. Ale na drukarce laserowej, drukując 16 stron formatu A na jednym arkuszu, co podgląd wydruku uważa za "stronę"?

Jak stwierdza akapit wprowadzający, podgląd wydruku działa jak drukarka. W związku z tym użytkownik zobaczy, co wyjdzie z wybranej drukarki. To widok decyduje, jaki obraz jest drukowany na każdej stronie.

Ciąg opisu strony w CPrintInfo strukturze zawiera sposób wyświetlania numeru strony użytkownikowi, jeśli może być reprezentowany jako jedna liczba na stronę (jak w sekcji "Strona 1" lub "Strony 1–2"). Ten ciąg jest używany przez domyślną implementację .CPreviewView::OnDisplayPageNumber Jeśli potrzebny jest inny ekran, można zastąpić tę funkcję wirtualną, na przykład "Arkusz1, Sekcje A, B".

Zobacz także

Uwagi techniczne według numeru
Uwagi techniczne według kategorii