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

Bu notu yazdırma özelleştirme işlemini açıklar ve baskı önizleme ve amaçları CView ve geri arama yordamları ve CPreviewView üye işlevleri kullanılan geri yordamları açıklar.

Sorunu

Mfc çoğu yazdırma için eksiksiz bir çözüm sağlar ve baskı önizleme gerekir. Çoğu durumda, küçük ek kod yazdırma ve Önizleme görünümü için gereklidir. Ancak, geliştirici parçası önemli çaba gerektiren yazdırma optimize etmek için yolu vardır ve bazı uygulamalar için Baskı Önizleme modunu özel kullanıcı arabirimi öğeleri eklemek gerekiyor.

Verimli baskı

Bir mfc uygulaması standart yöntemleri kullanarak yazdırdığında, Windows için bir bellek içi meta dosyası grafik aygıt arabirimi (GDI) çıkış aramalary yönlendirir. EndPage çağrıldığında Windows Meta dosyası bir sayfa yazdırmak için yazıcı gerektiren bir kez fiziksel her grup için oynuyor. Bu işleme sırasında GDI sık devam etmelidir olmadığını belirlemek için İptal prosedürü sorgular. Genellikle durdurma yordamı kullanıcı yazdırma iletişim kutusunu kullanarak yazdırma işini iptal böylece işlenmesini sağlar.

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ı olması gerekiyorsa, Manuel bantlama uygulamalıdır.

Yazdırma işlemi

Öyle ki OnPrint (grup) her sayfa başına birden çok kez denir elle bant için size yeniden yazdırma döngü uygulamalıdır. Yazdırma döngü viewprnt.cpp OnFilePrint işlevinde uygulanmaktadır. İçinde senin CView-türetilmiş sınıf, print komutu işlemek için ileti eşleme girdisini, yazdırma işlevini çağırır, bu işlev aşırı. OnFilePrint rutin kopyalama ve yazdırma döngü işlemi uygulamak için değiştirin. Muhtemelen de çizim sayfasının yazdırılmasını bölümüne göre optimize edebilirsiniz böylece baskı işlevlerinizi karışabileceğinden dikdörtgen geçmek istiyorum.

İkinci olarak, sık sık, grubun çizerken QueryAbort çağırmalısınız. Aksi takdirde iptal yordamı çağrılmaz ve kullanıcı yazdırma işini iptal etmek mümkün olacaktır.

Yazdırma ö&nizleme: nbsp; Elektronik kağıt ile kullanıcı arabirimi

Baskı Önizleme, özünde, içine bir yazıcının bir öykünme ekranı çalışır. Varsayılan olarak, istemci alanı ana penceresinin pencere içinde tam bir ya da iki sayfaları görüntülemek için kullanılır. Kullanıcı daha fazla ayrıntı görmek için sayfanın bir bölümünü yakınlaştırmak yapabiliyor. Ek destek ile kullanıcı bile Belge Önizleme modunda düzenlemek için izin.

Baskı Önizleme'yi Özelleştirme

Bu Not yalnızca baskı önizleme değiştirerek bir yönü ile ilgilidir: önizleme modu kullanıcı Arabirimi ekleme. Diğer değişiklikler mümkündür, ancak bu tartışmanın kapsamı dışında bu tür değişiklikler.

Kısaca, önizleme modu kullanıcı Arabirimi ekleme işlemi olduğunu:

  1. CPreviewView bir görünüm sınıf türetmek.

  2. Arzu UI açıdan için komut işleyicisi ekleyin.

  3. Görüntülemek için görsel açıdan ekliyorsanız, OnDraw geçersiz kılar ve çiziminizin sonra arama yapmak CPreviewView::OnDraw.

OnFilePrintPreview

Baskı Önizleme komutu işleyicisini budur. Kendi varsayılan uygulama:

void CView::OnFilePrintPreview()
{
 nbsp;  / / Türetilmiş sınıfları, özel pencere burada işleme uygulanması
    / / Kancasını çıkarmak çerçeve yakın çengel penceresini için emin olun.

/ / Bu çerçevede oluşturmamalıdır. Bu işlev daha uzun yaşamak gerekir
    CPrintPreviewState * pState = new CPrintPreviewState;

if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, bu,
                RU&NTIME_CLASS(CPreviewView), pState))
    {
        / / Özel pencere işleme türetilmiş sınıflarda, ters
        / / Burada önizleme hata durumda

TRACE0 ("hata: DoPrintPreview başarısız");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        pState Sil;      / / Önizleme başaramamak, / / devlet şimdi Sil
    }
}

DoPrintPreview , uygulamanın ana bölmesi gizlenir. Kontrol çubuğu, durum çubuğu gibi pState-gt belirterek muhafaza edilebilir;dwStates üye (için tek tek kontrol çubukları afx_controlbar_masktarafından (AFX_IDW_MYBAR) tanımlanmış bir bit maskesi ve BITS budur). Pencere pState - >nIDMainPane ise otomatik olarak gizli ve reshown pencere. DoPrintPreview sonra bir düğme çubuğu standart önizleme kullanıcı Arabirimi oluşturur. Özel pencere işleme tabi DoPrintPreview önce yapılması gereken diğer windows, göstermek veya gizlemek için böyle denir.

Baskı Önizleme bitirdiğinde, varsayılan olarak, kontrol çubuklarının özgün durumlarına ve görünür ana bölmesine döner. Özel işlem gerekmiyorsa, bir geçersiz kılma yapılmalıdır EndPrintPreview. DoPrintPreview başarısız olursa, aynı zamanda özel işlem sağlar.

DoPrintPreview çağrılır:

EndPrintPreview

Bu baskı önizleme modunu sonlandırmak için denir. Bu &genellikle son baskı önizlemede görüntülenen belge sayfasına taşımak için arzu edilir. EndPrintPreview yapmak için uygulama şansımız. PInfo-gt;m_nCurPage üye son sayfa (en soldaki iki sayfa görüntüleniyorsa) görüntülenen ve işaretçiyi nereye sayfasında kullanıcı ilgi için bir ipucu. Sen-meli sağlamak seçilen noktaya taşımak için kodu uygulamanın görünümü yapısı çerçeve bilinmeyen olduğundan,.

CView::EndPrintPreviewçağırmadan önce çoğu eylem gerçekleştirmeniz gerekir. Bu çağrıyı DoPrintPreview etkilerini tersine çevirir ve pView, pDC ve pInfo siler.

/ / Başka herhangi bir temizleme burada yapılmalı.
CView::EndPrintPreview (pDC, pInfo, nokta, pView)

CWinApp::OnFilePrintSetup

Bu yazdırma ayarları menü öğesi için eşlenmesi gerekir. Çoğu durumda, uygulama geçersiz kılmak için gerekli değildir.

Sayfa isimlendirme

Başka bir sorun sayfa numaralandırması ve sipariş olduğunu. Basit bir kelime işlemci türü uygulamalar için bu basit bir konudur. Yazdırılan her sayfasının belgedeki bir sayfaya karşılık gelen çoğu baskı önizleme sistemleri kabul.

Genelleştirilmiş bir çözüm sağlamak çalışırken, dikkat etmeniz gereken bazı şeyler vardır. Bir cad sistemi düşünün. Kullanıcı birkaç e-boyutunu yaprak kapsayan çizim vardır. e boyutu (ya da bir küçük ölçekli) çizici, basit durumunda olduğu gibi olacağını sayfa numaralandırma. Ama başına, 16 a boyutunda sayfa baskı bir lazer yazıcı ne baskı önizleme "sayfa" dikkate almaz?

Giriş paragrafı devletler gibi baskı önizleme yazıcı gibi davranmaktadır. Bu nedenle, kullanıcının ne seçilen belirli yazıcı üzerinden geleceğini göreceksiniz. Hangi resmi her sayfada yazdırılır belirlemek için Görünüm'e kadar olan.

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

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index