Aracılığıyla paylaş


TN030: Yazdırma ve Baskı Önizleme'yi özelleştirme

Not

İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.

Bu Not yazdırma ve Baskı Önizleme özelleştirme işlemini açıklar ve amacıyla kullanılan geri yordamları açıklar CView ve geri arama yordamları ve üye işlevlerini CPreviewView.

Sorunu

mfc çoğu yazdırma için eksiksiz bir çözüm sağlar ve Baskı Önizleme gerekiyor. Çoğu durumda, bir görünümü yazdırma ve önizleme yapmak için çok az ek kod gereklidir. Ancak, geliştirici bölümüne önemli çaba gerektiren yazdırma en iyileştirme yolları vardır ve bazı uygulamalar için Baskı Önizleme modunu özel kullanıcı arabirimi öğeleri eklemek gerekir.

Verimli yazdırma

mfc uygulaması standart yöntemleri kullanarak yazdırdığında, Windows bellek içi meta tüm grafik aygıt arabirimi (GDI) çıktı çağrılarını yönlendirir. Zaman EndPage olan adı verilen, Windows Meta dosyası için bir sayfa yazdırmak için yazıcı gerektiren bir kez her fiziksel bant çalar. Bu işleme sırasında GDI sık devam etmelidir belirlemek için İptal yordamı sorgular. Genellikle durdurma yordamı kullanıcı yazdırma iletişim kutusunu kullanarak yazdırma işini iptal, işlenecek iletilerine izin verir.

Ne yazık ki, bu yazdırma işlemi yavaşlatabilir. Uygulamanızın yazdırma standart tekniği kullanılarak elde edilebilir daha hızlı, şerit el ile uygulamalısınız.

Şerit'i Yazdır

Elle bant için re yazdırma döngü uygulamak gerekir, OnPrint (bir kez başına bant) sayfa başına birden çok defa çağrılır. Yazdırma döngü içinde uygulanan OnFilePrint viewprnt.cpp işlevinde. İçinde CView-türetilmiş sınıf, ileti eşleme girdisini yazdırma komutu işlemek için kendi yazdırma işlevini çağırır, bu işlevi tekrar. Copy OnFilePrint yordam ve şerit uygulamak için yazdırma döngüye Değiştir. Muhtemelen de böylece çizim yazdırılan sayfa bölümüne göre en iyi duruma getirebilirsiniz, yazdırma işlevlerinizi şerit dikdörtgen geçirmek istediğiniz.

İkinci olarak, sık sık çağırmanız gerekir QueryAbort bant çizim sırasında. Aksi takdirde İptal yordamı Isoch ve kullanıcı yazdırma işini iptal etmek mümkün olmayacaktır.

Baskı önizlemesi: Kullanıcı arabirimiyle elektronik kağıt

Baskı Önizleme, esas olarak, bir yazıcı öykünmesi içine görüntü dönüştürmeye çalışır. Varsayılan olarak, istemci alanının ana penceresinin pencere içinde tam bir veya iki sayfa görüntülemek için kullanılır. Daha ayrıntılı görmek için sayfanın bir bölümünü yakınlaştırmak mümkün olduğu. Ek destek ile kullanıcı bile belge önizleme modunda düzenleme izin verilebilir.

Baskı Önizleme özelleştirme

Bu not yalnızca Baskı Önizleme değiştirmenin tek boy ilgilenir: önizleme modu için kullanıcı Arabirimi ekleme. Diğer değişiklikleri mümkün, ancak bu tür değişiklikleri bu tartışmanın kapsamı dışında.

Önizleme modu kullanıcı Arabirimi eklemek için

  1. Görünüm sınıfından türeyen CPreviewView.

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

  3. Görüntü görsel yönleri ekliyorsanız, geçersiz kılma OnDraw ve sonra arama yaptığınız çizim yapma CPreviewView::OnDraw.

OnFilePrintPreview

Bu Baskı Önizleme komutu denetleyicisidir. Varsayılan uygulaması aşağıdaki gibidir:

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ölmesi gizlenir. Denetim çubuklarından durum çubuğu gibi tutulan pState - belirterek >dwStates üyesi (Bu bir bit maskesi ve tek tek kontrol çubukları için BITS tarafından tanımlanan afx_controlbar_mask(AFX_IDW_MYBAR)). Pencere pState - >nIDMainPane , otomatik olarak reshown ve gizlenecek penceresidir. DoPrintPreview , düğme çubuğu standart önizleme kullanıcı Arabirimi oluşturur. Özel pencere işleme gerekirse gibi önce yapılması diğer pencereleri göstermek veya gizlemek için DoPrintPreview olarak adlandırılır.

Baskı Önizleme sona erdiğinde, varsayılan olarak, Denetim çubuklarından özgün durumlarına ve ana bölmesine görünür döndürür. Özel işlem gerekirse bir geçersiz kılma yapılmalıdır EndPrintPreview. DoPrintPreview de sağlayan özel işlem başarısız.

DoPrintPreview çağrılır:

  • İletişim şablon önizleme araç çubuğu için kaynak kimliği.

  • Görünümü yazdırma için Baskı Önizleme gerçekleştirmek için bir işaretçi.

  • Önizleme görünümü sınıfının çalışma zamanı sınıf. Bu DoPrintPreview içinde dinamik olarak oluşturulur.

  • CPrintPreviewState işaretçi. CPrintPreviewState yapısı (veya uygulamanın daha fazla durumu korunur gerekiyorsa türetilmiş yapısı), Not değil çerçevesinde oluşturulabilir. Geçici DoPrintPreview ve EndPrintPreview kadar bu yapı atlatmalıdır.

    Not

    Ayrı bir görünüm veya Görünüm sınıf yazdırma desteği gerekiyorsa, bu nesneye bir işaretçi ikinci parametre olarak geçirilmelidir.

EndPrintPreview

Baskı Önizleme modunu sonlandırmak için verilir. Genellikle en son baskı önizlemede görüntülenen belge sayfasına gitmek için tercih edilir. EndPrintPreview Bunu yapmak için uygulamanın şansınızdır. PInfo - >m_nCurPage üyesidir (en soldaki iki sayfa görüntüleniyorsa) görüntülenen son sayfa ve işaretçisi olarak sayfada kullanıcı ilgileniyor nerede bir ipucu. Uygulamanın görünümü yapısını framework bilinmeyen olduğundan, seçilen noktaya taşımak için kod sağlamanız gerekir.

Arama önce çoğu eylemler gerçekleştirmesi gereken CView::EndPrintPreview. Bu çağrı etkilerini tersine çevirir DoPrintPreview ve pView, pDC ve pInfo siler.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

Yazdırma ayarı menü öğesi için eşlenmelidir. Çoğu durumda, uygulama geçersiz kılmak gerekli değildir.

Sayfa Nomenclature

Başka bir sorun ve sayfa numaralandırma sırasını olmasıdır. Basit bir sözcük işlemci türü uygulamalar için bu basit bir sorundur. Baskı Önizleme sistemlerin çoğu, yazdırılan her sayfada belgedeki bir sayfaya karşılık gelen varsayalım.

Genelleştirilmiş bir çözüm sağlamak çalışırken, göz önüne almanız gereken birkaç şey vardır. cad sistemi düşünün. Kullanıcı birkaç e boyutu sayfa kapsayan bir çizim vardır. e boyutu (veya daha küçük, ölçeklenebilir) çizici gibi basit bir durumda olacak sayfa numaralandırma. Ancak, başına 16 a boyutu sayfa yazdırma bir lazer yazıcıda ne Baskı Önizleme "Sayfa" dikkate almaz?

Giriş paragrafı sunulduğu gibi Baskı Önizleme yazıcı gibi davranmaktadır. Bu nedenle, kullanıcı seçili belirli yazıcı dışında gelir görürsünüz. En çok hangi resmi yazdırılan her sayfada belirlemek için Görünüm değil.

Sayfa açıklama dizesi CPrintInfo yapısı (olarak, "Sayfa 1" veya "Sayfa 1-2") sayfa başına bir sayı olarak gösterilebiliyorsa, kullanıcıya sayfa numarasını görüntüleyen bir araç sağlar. Bu dize varsayılan uygulama tarafından kullanılan CPreviewView::OnDisplayPageNumber. Farklı bir görüntü gerekirse, bir sanal bu işlevi, örneğin, "Sayfa1, Bölüm a, b" sağlamak için geçersiz kılabilir.

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar