TN030: Dostosowywanie drukowanie i Podgląd wydruku
[!UWAGA]
Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.
Uwaga ta opisuje proces dostosowywania podglądu drukowania i drukowania oraz celów procedury zwrotne w CView oraz procedury zwrotne i funkcji elementów członkowskich z CPreviewView.
Problem
MFC stanowi kompletne rozwiązanie dla większości drukowania i potrzeb w podglądzie wydruku.W większości przypadków musi mieć możliwość drukowania i podglądu widoku jest niewiele dodatkowy kod.Jednak istnieją sposoby optymalizacji drukowania, który wymaga znacznego wysiłku ze strony autora i niektórych aplikacji 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 wywołania metapliku w pamięci danych wyjściowych graficzny interfejs urządzenia (GDI).Gdy EndPage jest wywoływana, system Windows odtwarza metapliku raz dla każdego pasma fizycznego, że drukarka wymaga, aby wydrukować jedną stronę.Podczas tego renderowania GDI często kwerendy przerwać procedurę ustalania, jeśli należy kontynuować.Zwykle procedury abort umożliwia komunikatów do przetworzenia, dzięki czemu użytkownik może przerwać zadania drukowania za pomocą okna dialogowego drukowania.
Niestety to spowolnić proces drukowania.Jeśli drukowanie w aplikacji muszą być szybciej niż można osiągnąć przy użyciu standardowych techniki, musi implementować ręcznego podziału na przedziały.
Drukowanie podziału na przedziały
Do zespołu ręcznie, należy re zaimplementować wydruku pętli takie, że OnPrint jest wywołana wiele razy na stronie (raz na zespołu).Pętla wydruku jest zaimplementowana w OnFilePrint funkcji viewprnt.cpp.W sieci CView-klasy, przeciążenie tej funkcji, tak aby wpisu mapowania wiadomości dla obsługi polecenia print wywołuje funkcję drukowania.Kopiuj OnFilePrint rutynowych i zmień wydruku pętli w celu wdrożenia podziału na przedziały.Prawdopodobnie również chcesz przekazać podziału na przedziały prostokąt funkcje drukowania, tak, aby optymalizować rysunek na podstawie sekcji strony drukowane.
Po drugie, często trzeba wywołać QueryAbort podczas rysowania zespołu.W przeciwnym razie nie będzie wywoływany przerwania procedury i użytkownik będzie mógł anulować zadanie drukowania.
Podglądu wydruku: Elektroniczne papieru interfejsu użytkownika
Zasadniczo, Podgląd wydruku próbuje włączyć wyświetlanie do emulacji drukarki.Domyślnie okna głównego obszaru klienckiego służy do wyświetlania jednego lub dwóch stron w pełni w oknie.Użytkownik może powiększyć obszar strony, aby wyświetlić ją bardziej szczegółowo.Z dodatkowej pomocy użytkownik może nawet dozwolone do edycji dokumentu w trybie podglądu.
Dostosowywanie podglądu wydruku
Uwaga ta dotyczy tylko jednego aspektu modyfikowanie podglądu wydruku: Dodawanie interfejsu użytkownika do trybu podglądu.Możliwe są inne zmiany, ale zmiany te są poza zakresem tej dyskusji.
Aby dodać interfejs użytkownika do trybu podglądu
Klasę widoku z CPreviewView.
Dodawanie obsługi polecenia dla żądanych aspekty interfejsu użytkownika.
Jeśli dodajesz aspektów wizualnych do wyświetlania zastępują OnDraw i wykonywać na rysunku po wywołaniu CPreviewView::OnDraw.
OnFilePrintPreview
To polecenie programu obsługi podglądu 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.Pasków, takie jak pasek stanu, można zachować określając je w stanu wydajności - >dwStates Członkowskich (jest to maska bitowa i bitów dla poszczególnych pasków są definiowane przez AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Okno stanu wydajności - >nIDMainPane jest okno, w którym zostanie automatycznie ukryta i reshown.DoPrintPreview paska przycisków spowoduje to utworzenie standardowego interfejsu użytkownika podglądu.Jeśli potrzebna jest obsługa specjalne okno, takie, aby ukryć lub wyświetlić inne okna, które powinno być wykonane przed DoPrintPreview jest wywoływana.
Domyślnie po zakończeniu podglądu wydruku, zwraca pasków do ich oryginalnego Państwa i głównym okienku, aby widoczne.Jeśli potrzebna jest obsługa specjalna, należy to zrobić w nadpisanie EndPrintPreview. Jeśli DoPrintPreview nie powiedzie się, jest również zapewnienie specjalnej obsługi.
DoPrintPreview jest wywoływana z:
Identyfikator zasobu, okno dialogowe szablonu dla narzędzi Podgląd.
Wskaźnik do widoku, aby wykonać wydruk podglądu wydruku.
Klasa run-time klasy widoku Podgląd.Będzie można dynamicznie utworzyć w DoPrintPreview.
Wskaźnik CPrintPreviewState.Uwaga, że struktura CPrintPreviewState (lub pochodnych struktury, jeśli aplikacja wymaga więcej Państwie zachowane) musi nie można utworzyć na ramki.DoPrintPreview jest niemodalny, a ta struktura muszą przetrwać, dopóki nie zostanie wywołana EndPrintPreview.
[!UWAGA]
Jeśli osobny widok lub widoku klasy jest potrzebne 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świetlane w podglądzie wydruku.EndPrintPreview jest aplikacja szansę, aby to zrobić.PInfo - >m_nCurPage Członkowskie jest stroną, która była ostatnio wyświetlane (po lewej stronie, jeśli były wyświetlane dwie strony), a wskaźnik jest Wskazówka co do tego, gdzie na stronie użytkownika był zainteresowany.Ponieważ struktura widoku aplikacji jest nieznana RAM, należy podać kod, aby przejść do wybranego miejsca.
Należy wykonać większość akcji przed połączeniem CView::EndPrintPreview.To wywołanie odwraca skutki DoPrintPreview i usuwa pView, pDC i pInfo.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
To musi być mapowana do elementu menu Ustawienia wydruku.W większości przypadków nie jest konieczne implementację.
Nomenklatura strony
Inny problem jest numeracja stron i zamówienia.Aplikacje typu prostego edytora tekstów jest to prosty problem.Większość systemów podglądu wydruku założono, że każdej drukowanej stronie odpowiada jednej strony w dokumencie.
Podczas próby uogólniony rozwiązanie, istnieje kilka rzeczy, które należy rozważyć.Wyobraźmy sobie systemu CAD.Użytkownik ma rysunku, który obejmuje kilka arkuszy e rozmiar.E-rozmiaru (lub mniejsze, skalowane) plotera, byłoby numerowanie stron w przypadku prostych.Tylko na drukarce laserowej, drukowanie 16 stron a rozmiar na arkuszu, co Podgląd wydruku za "Strona"?
W akapicie wprowadzającym Państwa, Podgląd wydruku działa jak do drukarki.Dlatego użytkownik będzie widział co będzie pochodzić z określonej drukarki, która jest zaznaczona.Jest do widoku, aby określić, jaki obraz jest drukowany na każdej stronie.
Ciąg opisu strony w CPrintInfo struktury zapewnia sposób wyświetlania numeru strony do użytkownika, jeśli może być reprezentowany jako numer jeden na stronę (jak w "Strona 1" lub "strony 1-2").Ciąg ten jest używany w wykonywaniu domyślne CPreviewView::OnDisplayPageNumber.W razie potrzeby wyświetlania różnych jeden może zastąpić ten wirtualny funkcji, na przykład "Arkusz1, sekcjach A, B".