TN030: dostosowywanie drukowania i podglądu wydruku
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Uwaga ta opisuje proces dostosowywania podglądu wydruku i drukowania oraz celów procedur wywołania zwrotnego, używane w CView oraz wywołania zwrotnego procedur i funkcji elementów członkowskich z CPreviewView.
Problem
MFC stanowi kompletne rozwiązanie dla większości drukowanie i Podgląd wydruku musi.W większości przypadków musi mieć możliwość drukowania i wyświetlić podgląd widoku jest mało dodatkowy kod.Jednak istnieją sposoby optymalizacji drukowania, który wymaga znacznego wysiłku ze strony autora, a niektóre aplikacje należy dodać elementy interfejsu użytkownika w trybie podglądu wydruku.
Wydajne drukowanie
Gdy aplikacja MFC drukuje, używając metod standardowych, Windows kieruje wszystkie połączenia danych wyjściowych graficzny interfejs urządzenia (GDI) na metapliki w pamięci.Gdy EndPage jest wywoływana, system Windows odtwarza metapliku tylko jeden raz dla każdego fizycznego zespół, który drukarka wymaga, aby wydrukować jedną stronę.Podczas tego renderowania interfejsu GDI kwerendy często przerwać procedura w celu określenia, czy należy kontynuować.Zazwyczaj procedura przerwania pozwala wiadomości mają być przetwarzane tak, że użytkownik może przerwać zadania drukowania za pomocą okna dialogowego drukowania.
Niestety to spowolnienie procesu drukowania.Jeśli drukowanie w aplikacji musi być szybciej, niż to było możliwe przy użyciu techniki standardowej, należy zaimplementować ręcznego podziału na przedziały.
Drukowanie podziału na przedziały
Aby ręcznie pasmo, należy ponownie zaimplementować wydruku pętli takie, że OnPrint jest wywołana wiele razy na stronie (raz na pasmo).Drukuj pętli jest zaimplementowana w OnFilePrint funkcja w viewprnt.cpp.W swojej CView-klasy, przeciążenie tej funkcji, aby wiadomość wpisu mapowania obsługi polecenia print wywołania funkcji drukowania.Kopiuj OnFilePrint rutynowych i zmiana wydruku pętli w celu wdrożenia podziału na przedziały.Prawdopodobnie będzie również należy przekazywać metody podziału na przedziały prostokąt do funkcji drukowania, tak, że można zoptymalizować rysunku na podstawie sekcji strony drukowane.
Po drugie, często należy wywołać QueryAbort podczas rysowania zespołu.W przeciwnym wypadku nie ma zostać wywołana procedura przerwania i użytkownik będzie mógł anulować zadanie drukowania.
Podgląd wydruku: Elektroniczny papier z interfejsem użytkownika
W istocie, Podgląd wydruku, drukowanie próbuje włączyć wyświetlanie do emulacji drukarki.Domyślnie obszar klienta okna głównego służy do wyświetlania jednej lub dwóch stron w pełni w ramach okna.Użytkownik jest w stanie powiększyć obszar strony, aby wyświetlić więcej szczegółów.Dodatkowe wsparcie użytkownika nawet dopuszcza się do edycji dokumentu w trybie podglądu.
Dostosowywanie podglądu wydruku
Uwaga ta dotyczy jedynie jednego aspektu modyfikowanie podglądu wydruku: Dodawanie interfejsu użytkownika do trybu podglądu.Inne modyfikacje są możliwe, ale zmiany te są poza zakresem tej dyskusji.
Aby dodać interfejs użytkownika do trybu podglądu
Pochodzić od klasy widok z CPreviewView.
Dodaj polecenia obsługi pragnienie aspekty interfejsu użytkownika.
Jeśli dodajesz aspektów wizualnych do wyświetlania zastąpić OnDraw i wykonywać na rysunku po wywołaniu CPreviewView::OnDraw.
OnFilePrintPreview
Jest to program obsługi polecenia Podgląd wydruku.Jego domyślna implementacja jest:
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 okienka głównym aplikacji.Paski kontroli, takich jak pasek stanu, można zachować przez określenie ich stanu wydajności->dwStates Członkowskich (jest to maska bitowa i bitów dla konkretnego formantu paski są definiowane przez AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Okno stanu wydajności ->nIDMainPane to okno, które zostanie automatycznie ukryta i reshown.DoPrintPreview spowoduje utworzenie paska przycisków standardowego interfejsu użytkownika podglądu.Jeśli potrzebna jest obsługa specjalne okno, takie, aby ukryć lub pokazać inne okna, które należy zrobić przed DoPrintPreview nazywa się.
Domyślnie po zakończeniu podglądu wydruku, zwraca paski sterowania do stanu początkowego i głównego okienka, aby widoczne.W razie potrzeby specjalnego traktowania powinno się to odbywać w nadpisanie EndPrintPreview. Jeśli DoPrintPreview się nie powiedzie, również zapewnienie specjalnej obsługi.
DoPrintPreview jest wywoływana z:
Identyfikator zasobu szablonu okno, na pasku narzędzi podglądu.
Wskaźnik do widoku, aby wykonać wydruk, Podgląd wydruku.
Klasa wykonywania klasy widoku Podgląd.Będzie można dynamicznie utworzyć w DoPrintPreview.
Wskaźnik CPrintPreviewState.Uwaga musi struktura CPrintPreviewState (lub pochodnych struktury, jeśli aplikacja wymaga więcej Państwie zachowane) nie można utworzyć na ramce.Ta struktura musi przetrwać do EndPrintPreview jest nazywany DoPrintPreview jest niemodalny.
[!UWAGA]
Jeśli osobny widok lub widok klasy jest potrzebny do obsługi drukowania, wskaźnik do obiektu należy przekazywać jako drugi parametr.
EndPrintPreview
Jest to, aby zakończyć tryb podglądu wydruku.Często jest to pożądane, aby przejść do strony w dokumencie, który był ostatnio wyświetlany w podglądzie wydruku.EndPrintPreview jest szansa aplikacji to zrobić.PInfo ->m_nCurPage członek jest stroną, która ostatnio był wyświetlany (po lewej stronie, jeśli dwie strony były wyświetlane), a wskaźnik jest podpowiedź, gdzie na stronie użytkownika był zainteresowany.Ponieważ struktura widoku aplikacji jest nieznany do RAM, należy podać kod, aby przejść do wybranego miejsca.
Należy wykonać większość czynności przed wywołaniem funkcji CView::EndPrintPreview.To wywołanie odwraca skutki DoPrintPreview i usuwa pView, kontroler pDC i pInfo.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
To musi być mapowane do elementu menu Ustawienia wydruku.W większości przypadków nie ma konieczności zastąpić stosowania.
Nomenklatura strony
Innym zagadnieniem jest numeracja stron i zamówienia.Dla aplikacji typu prostego edytora tekstów jest proste problem.Większość systemów podglądu wydruku założono, że każdej drukowanej stronie odpowiada jednej stronie w dokumencie.
Staramy się zapewnić roztwór uogólnione, istnieje kilka rzeczy do rozważenia.Wyobraźmy sobie system CAD.Użytkownik ma rysunku, który obejmuje kilka arkuszy E-size.W E-size (lub mniejsze, skalowane) plotera, numeracja stron będzie tak jak w przypadku prostych.Ale na drukarce laserowej, drukowanie 16 A rozmiar stron na jednym arkuszu, co podglądu wydruku należy wziąć pod uwagę "Strona"?
Jak stwierdza akapit wprowadzający, Podgląd wydruku działa jak do drukarki.W związku z tym użytkownik będzie widział co wyjdzie z danej drukarki, która jest zaznaczona.To do widoku, aby określić, jaki obraz jest drukowany na każdej stronie.
Ciąg opisu strony w CPrintInfo strukturę zapewnia sposób wyświetlania numeru strony do użytkownika, jeśli może być reprezentowana jako jeden numer na każdej stronie (tak jak w "Strona 1" lub "strony 1-2"). Ciąg ten jest używany przez wdrożenie domyślne CPreviewView::OnDisplayPageNumber.W razie potrzeby innego ekranu jeden może spowodować zastąpienie tej funkcji wirtualnych się zapewnić, na przykład "Arkusz1, sekcjach A, B".