Aracılığıyla paylaş


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 CPreviewViewamaç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.

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, 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

  1. öğesinden CPreviewViewbir görünüm sınıfı türetin.

  2. İstediğiniz kullanıcı arabirimi yönleri için komut işleyicileri ekleyin.

  3. Ekrana görsel yönler ekliyorsanız, çağrısından CPreviewView::OnDrawsonra çiziminizi geçersiz kılın OnDraw 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 EndPrintPreviewyapı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::OnDisplayPageNumbertarafı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.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar