Krzysztof Mossakowski
Materiały dla studentów
 

Drukowanie

MFC
Spis treści

Rysowanie
klasa CDC
Informacje ogólne
Zadania aplikacji jako obiektu MFC podczas drukowania
Wykorzystanie klasy widoku MFC
Dodatkowe możliwości wydruków
Hierarchia klas

  •  Informacje ogólne

    • Podstawową zasadą Windows jest WYSIWYG (What You See Is What You Get), czyli maksymalne podobieństwo wydruku do obrazu z ekranu

      • konsekwencją tego założenia było upodobnienie drukowania do operacji graficznych na ekranie

      • drukowanie jest w rzeczywistości rysowaniem na kontekście urządzenia dostarczonym przez system i reprezentującym drukarkę

      • stwarza to możliwość prostego generowania podglądów wydruków - zamiast rzeczywistego kontekstu drukarki jako docelowy kontekst urządzenia jest przekazywany kontekst ekranu, na którym pojawi się podgląd

[początek strony]

  • Zadania aplikacji jako obiektu MFC podczas drukowania

    • Większość czynności związanych z drukowaniem lub generowaniem podglądu wydruku spełnia widok dokumentu (obiekt klasy CView lub pochodnej), dla aplikacji pozostaje:

      • wyświetlanie dialogu wydruku

      • utworzenie docelowego kontekstu urządzenia

      • wywołanie CDC::StartDoc przy rozpoczęciu zadania drukowania i CDC::EndDoc przy zakończeniu

      • wywołanie CDC::StartPage przy rozpoczęciu drukowania strony i CDC::EndPage przy zakończeniu

    [początek strony]

  • Wykorzystanie klasy widoku MFC

    • Klasa widoku CView MFC przejmuje większość zadań aplikacja podczas przygotowania i przebiegu wydruku:
      • poinformowanie o liczbie stron wydruku
      • umiejętność drukowania (czyli rysowania na kontekście drukarki) części dokumentu, gdy pożądany jest wydruk tylko niektórych stron
      • przydzielanie i zwalnianie obiektów GDI wykorzystywanych podczas drukowania
      • wysyłanie kodów sterujących do drukarki przed wydrukiem strony (np. dla zmiany orientacji strony)
    • Wirtualne funkcje klasy CView umożliwiające zmianę standardowego sposobu obsługi wydruków:
      • CView::OnPreparePrinting
        - wywoływana gdy dokument ma zostać wydrukowany lub ma zostać wyświetlony podgląd wydruku
        - parametrem jest obiekt klasy CPrintInfo, za pośrednictwem którego można m.in. zmienić liczbę stron wydruku oraz określić, czy ma zostać wykonane drukowanie czy podgląd wydruku
        - standardowa implementacja tej funkcji jest pusta, aby rozpocząć wydruk lub wyświetlanie podglądu wydruku należy wywołać CView::DoPreparePrinting (ta funkcja wyświetli także dialog wydruku jeśli aktualną akcją nie jest generowanie podglądu)
      • CView::OnBeginPrinting
        - jest miejscem, w którym można dokonać alokacji obiektów GDI wykorzystywanych tylko w drukowaniu (docelowy kontekt drukarki jest przekazywany jako parametr tej funkcji)
        - standardowa implementacja tej funkcji jest pusta
      • CView::OnPrepareDC
        - wspólna funkcja wywoływana przy rysowaniu na ekranie i przy drukowaniu; jeśli aktualną akcją jest drukowanie parametr będący wskaźnikiem na obiekt klasy CPrintInfo jest różny od NULL
        - można zatrzymać drukowanie poprzez ustawienie CPrintInfo::m_bContinuePrinting na FALSE
      • CView::OnPrint
        - dokonuje rzeczywistego wydruku jako rysowania na kontekście przekazanym jako parametr
        - standardowa implementacja wywołuje CView::OnDraw
      • CView::OnEndPrinting
        - miejsce zwalniania obiektów GDI wykorzystanych podczas drukowania przydzielonych w CView::OnBeginPrinting

[początek strony]

  •  Dodatkowe możliwości wydruków

    • Schemat drukowania dokumentów wielostronicowych:

      • CView::OnPreparePrinting (z możliwością wywołania CView::DoPreparePrinting, która wyświetla dialog wydruku)

      • CView::OnBeginPrinting (możliwość zmiany całkowitej długości drukowanego dokumentu)

      • CDC::StartDoc (rozpoczęcie zadania drukowania)

      • CView::OnPrepareDC (inicjalizacja strony, np viewport)

      • CDC::StartPage (rozpoczęcie wydruku strony)

      • CView::OnPrint (wydruk strony)

      • CDC::EndPage (zakończenie wydruku strony)

      • CDC::EndDoc (zakończenie całego zadania drukowania)

    • Zakończenie drukowania dokumentu, gdy nie ma możliwości wcześniejszego sprawdzenia liczby stron:

      • w CView::OnPrepareDC ustawić CPrintInfo::m_bContinuePrinting na FALSE jeśli drukowanie ma zostać zakończone

    • Drukowanie nagłówków i stopek

      • nadpisać CView::OnPrint i oprócz drukowania zawartości strony dodać kod rysujący na docelowym kontekście nagłówek i stopkę

      • jeśli nie ma wystarczająco dużo miejsca trzeba zmniejszyć obszar drukowania trzymany w CPrintInfo::m_rectDraw

    • Podgląd wydruku

      • CPreviewDC - specjalna klasa wykorzystywana przy generowaniu podglądów wydruków (nieudokumentowana)

      • obiekt tej klasy jest generowany przez aplikację MFC i naśladowane są wszystkie czynności drukowania z tym kontekstem jako docelowym

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
       CDC
            CPreviewDC
    CPrintInfo

[początek strony]