TN030: Yazdırmayı ve Baskı Önizlemeyi Özelleştirme
Dekont
Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.
Bu not, yazdırma ve baskı önizlemeyi özelleştirme işlemini açıklar ve içinde CView
kullanılan geri çağırma yordamlarının ve geri çağırma yordamlarının ve üye işlevlerinin CPreviewView
amaçlarını açıklar.
Sorun
MFC, yazdırma ve baskı önizleme gereksinimlerinin çoğu için eksiksiz bir çözüm sağlar. Çoğu durumda, bir görünümün yazdırabilmesi ve önizleme yapabilmesi için çok az ek kod gerekir. Ancak, yazdırmayı iyileştirmenin geliştirici açısından önemli çaba gerektiren yolları vardır ve bazı uygulamaların baskı önizleme moduna belirli kullanıcı arabirimi öğeleri eklemesi gerekir.
Verimli Yazdırma
MFC uygulaması standart yöntemleri kullanarak yazdırıldığında, Windows tüm Grafik Cihaz Arabirimi (GDI) çıkış çağrılarını bellek içi meta dosyaya yönlendirir. Çağrıldığında EndPage
Windows, yazıcının bir sayfa yazdırması için gereken her fiziksel bant için meta dosyasını bir kez çalar. Bu işleme sırasında GDI, devam etmesi gerekip gerekmediğini belirlemek için sık sık Abort Yordamını sorgular. Genellikle iptal yordamı iletilerin işlenmesine olanak tanır, böylece kullanıcı yazdırma iletişim kutusunu kullanarak yazdırma işini durdurabilir.
Ne yazık ki bu işlem yazdırma işlemini yavaşlatabilir. Uygulamanızdaki yazdırmanın standart teknik kullanılarak elde edilenden daha hızlı olması gerekiyorsa, el ile bantlama uygulamanız gerekir.
Yazdırma Bantları
El ile bant uygulamak için, sayfa başına birden çok kez (bant başına bir kez) olarak adlandırılan yazdırma döngüsünü OnPrint
yeniden uygulamanız gerekir. Yazdırma döngüsü, viewprnt.cpp dosyasındaki işlevinde uygulanır OnFilePrint
. Türetilmiş sınıfınızda CView
, yazdırma komutunu işlemeye yönelik ileti eşleme girişinin yazdırma işlevinizi çağırması için bu işlevi aşırı yüklersiniz. OnFilePrint
Yordamı kopyalayın ve bant oluşturma uygulamak için yazdırma döngüsünü değiştirin. Büyük olasılıkla yazdırma işlevlerinize bant dikdörtgenini de geçirmek isteyeceksiniz, böylece çizimi yazdırılmakta olan sayfanın bölümüne göre iyileştirebilirsiniz.
İkincisi, bandı çizerken sık sık aramanız QueryAbort
gerekir. Aksi takdirde, İptal Yordamı çağrılmaz ve kullanıcı yazdırma işini iptal edemez.
Baskı Önizleme: Kullanıcı Arabirimi ile Elektronik Kağıt
Baskı Önizleme, temelde ekranı bir yazıcı öykünmesi haline getirmeye çalışır. Varsayılan olarak, ana pencerenin istemci alanı bir veya iki sayfayı pencere içinde tam olarak görüntülemek için kullanılır. Kullanıcı, sayfanın bir alanını daha ayrıntılı görmek için yakınlaştırabilir. Ek destekle, kullanıcının belgeyi önizleme modunda düzenlemesine bile izin verilebilir.
Baskı Önizlemeyi Özelleştirme
Bu not, baskı önizlemeyi değiştirmenin yalnızca bir yönüyle ilgilidir: Önizleme moduna kullanıcı arabirimi ekleme. Diğer değişiklikler mümkündür, ancak bu değişiklikler bu tartışmanın kapsamı dışındadır.
Önizleme moduna kullanıcı arabirimi eklemek için
öğesinden
CPreviewView
bir görünüm sınıfı türetin.İstediğiniz kullanıcı arabirimi yönleri için komut işleyicileri ekleyin.
Ekrana görsel yönler ekliyorsanız, çağrısından
CPreviewView::OnDraw
sonra çiziminizi geçersiz kılınOnDraw
ve gerçekleştirin.
OnFilePrintPreview
Bu, baskı önizleme için komut işleyicidir. Varsayılan uygulaması:
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
uygulamanın ana bölmesini gizler. Durum çubuğu gibi Denetim Çubukları, pState-dwStates> üyesinde belirtilerek korunabilir (Bu bir bit maskesidir ve tek tek denetim çubuklarının bitleri AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR) tarafından tanımlanır). pState-nIDMainPane> penceresi, otomatik olarak gizlenecek ve yeniden gösterilecek penceredir. DoPrintPreview
ardından standart Önizleme kullanıcı arabirimi için bir düğme çubuğu oluşturur. Diğer pencereleri gizlemek veya göstermek gibi özel pencere işleme gerekiyorsa, çağrılmadan önce DoPrintPreview
bu yapılmalıdır.
Varsayılan olarak, baskı önizleme tamamlandığında denetim çubuklarını özgün durumlarına, ana bölmeyi görünür hale getirir. Özel işleme gerekiyorsa, geçersiz kılmada EndPrintPreview
yapılmalıdır. Başarısız olursa DoPrintPreview
özel işleme de sağlayın.
DoPrintPreview şu şekilde çağrılır:
Önizleme araç çubuğunun iletişim kutusu şablonunun Kaynak Kimliği.
Baskı önizleme için yazdırmayı gerçekleştirmek için görünümün işaretçisi.
Önizleme Görünümü sınıfının çalışma zamanı sınıfı. Bu, DoPrintPreview'da dinamik olarak oluşturulur.
CPrintPreviewState işaretçisi. Çerçevede CPrintPreviewState yapısının (veya uygulamanın daha fazla durum koruması gerekiyorsa türetilmiş yapının) oluşturulmaması gerektiğini unutmayın. DoPrintPreview moduzdur ve EndPrintPreview çağrılana kadar bu yapı hayatta kalmalıdır.
Dekont
Yazdırma desteği için ayrı bir görünüm veya görünüm sınıfı gerekiyorsa, bu nesneye yönelik bir işaretçi ikinci parametre olarak geçirilmelidir.
EndPrintPreview
Bu, baskı önizleme modunu sonlandırmak için çağrılır. Belgedeki en son baskı önizlemede görüntülenen sayfaya gitmek genellikle tercih edilir. EndPrintPreview
uygulamanın bunu yapma şansıdır. pInfo-m_nCurPage> üyesi en son görüntülenen sayfadır (iki sayfa görüntülendiyse en soldaki) ve işaretçi, kullanıcının sayfanın neresinde ilgilendiğine ilişkin bir ipucudur. Uygulamanın görünümünün yapısı çerçevede bilinmediğinden, seçilen noktaya taşımak için kodu sağlamanız gerekir.
çağırmadan CView::EndPrintPreview
önce eylemlerin çoğunu gerçekleştirmelisiniz. Bu çağrı pView, pDC ve pInfo'nun DoPrintPreview
etkilerini tersine çevirir ve siler.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
Bu, Yazdırma Kurulumu menü öğesi için eşlenmelidir. Çoğu durumda, uygulamayı geçersiz kılmak gerekli değildir.
Sayfa Sıfatları
Bir diğer sorun da sayfa numaralandırma ve sıralamadır. Basit sözcük işlemci türü uygulamalar için bu basit bir sorundur. Çoğu baskı önizleme sistemi, yazdırılan her sayfanın belgedeki bir sayfaya karşılık geldiğini varsayar.
Genelleştirilmiş bir çözüm sağlamaya çalışırken dikkate alınması gereken birkaç şey vardır. Bir CAD sistemi düşünün. Kullanıcının birkaç E boyutlu sayfayı kapsayan bir çizimi vardır. E boyutlu (veya daha küçük, ölçeklendirilmiş) bir çizicide, sayfa numaralandırması basit örnekte olduğu gibi olur. Ancak bir lazer yazıcıda, sayfa başına 16 A boyutlu sayfa yazdırırken, baskı önizlemede "sayfa" olarak ne düşünülmektedir?
Giriş paragrafı olarak, Baskı Önizleme bir yazıcı gibi hareket ediyor. Bu nedenle, kullanıcı seçilen belirli bir yazıcıdan nelerin geleceğini görür. Her sayfada hangi görüntünün yazdırılacağını belirlemek görünüme bağlıdır.
Yapıdaki CPrintInfo
sayfa açıklaması dizesi, sayfa numarası sayfa başına bir sayı olarak gösterilebiliyorsa ("Sayfa 1" veya "Sayfa 1-2"de olduğu gibi) kullanıcıya görüntüleme aracı sağlar. Bu dize varsayılan uygulaması CPreviewView::OnDisplayPageNumber
tarafından kullanılır. Farklı bir görüntü gerekiyorsa, "Sayfa1, Bölüm A, B" gibi bir ekran sağlamak için bu sanal işlevi geçersiz kılabilir.