TN030: dostosowywanie drukowania i podglądu wydruku

Uwaga

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 drukowania i drukowania oraz opisano cele procedur wywołania zwrotnego używanego w CView procedurach wywołania zwrotnego i funkcji składowych programu CPreviewView.

The 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 umożliwiający drukowanie i wyświetlanie 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 pasować, należy ponownie zaimplementować pętlę drukowania, która OnPrint jest wywoływana wiele razy na stronę (raz na przedział). Pętla drukowania jest implementowana w OnFilePrint funkcji w pliku viewprnt.cpp. CViewW klasie -pochodnej przeciążasz tę funkcję, aby wpis mapy komunikatów do obsługi polecenia drukowania wywołuje funkcję drukowania. Skopiuj procedurę OnFilePrint i zmień pętlę drukowania, aby zaimplementować banding. Prawdopodobnie zechcesz również przekazać prostokąt pasujący do funkcji drukowania, aby można było zoptymalizować rysunek na podstawie sekcji drukowanej strony.

Po drugie, należy często wywoływać QueryAbort podczas rysowania przedziału. 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. Tworzenie klasy widoku z CPreviewViewklasy .

  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

Jest to procedura obsługi 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 pState-dwStates> (jest to maska bitowa, a bity poszczególnych pasków sterowania są definiowane przez AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)). Okno pState-nIDMainPane> 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 DoPrintPreview wywołaniami.

Domyślnie po zakończeniu podglądu wydruku zwraca paski kontrolek do ich oryginalnych stanów i okienka głównego, aby było widoczne. Jeśli wymagana jest specjalna obsługa, należy ją wykonać w 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 w wersji zapoznawczej.

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

  • 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 jest moderowa i ta struktura musi przetrwać do momentu wywołania endPrintPreview.

    Uwaga

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

EndPrintPreview

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. Element członkowski pInfo-m_nCurPage> to strona, która była ostatnio wyświetlana (po lewej stronie, jeśli były wyświetlane dwie strony), a wskaźnik jest wskazówką dotyczącą miejsca, w którym użytkownik był zainteresowany. Ponieważ struktura widoku aplikacji jest nieznana w strukturze, należy podać kod, aby 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 wykresu E-size (lub mniejszego, skalowanego) numerowanie stron byłoby tak jak w prostym przypadku. Ale na drukarce laserowej drukowanie 16 stron o rozmiarze A na arkuszu, co robi podgląd wydruku rozważyć "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. Widok zależy od tego, 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 też

Uwagi techniczne według numerów
Uwagi techniczne według kategorii