Aracılığıyla paylaş


Birden Fazla Belge

Bu makalede, Windows yazdırma protokolü açıklanır ve birden fazla sayfa içeren belgelerin nasıl yazdırıldığı açıklanır. Makale aşağıdaki konuları kapsar:

Yazdırma Protokolü

Çok sayfalı bir belgeyi yazdırmak için çerçeve ve görünüm aşağıdaki şekilde etkileşim kurar. İlk olarak çerçeve Yazdır iletişim kutusunu görüntüler, yazıcı için bir cihaz bağlamı oluşturur ve CDC nesnesinin StartDoc üye işlevini çağırır. Ardından, belgenin her sayfası için çerçeve nesnenin StartPage üye işlevini CDC çağırır, görünüm nesnesine sayfayı yazdırmasını bildirir ve EndPage üye işlevini çağırır. Belirli bir sayfayı başlatmadan önce yazıcı modunun değiştirilmesi gerekiyorsa, görünüm ResetDC'yi çağırır ve bu da yeni yazıcı modu bilgilerini içeren DEVMODE yapısını güncelleştirir. Belgenin tamamı yazdırıldığında, çerçeve EndDoc üye işlevini çağırır.

Görünüm Sınıfı İşlevlerini Geçersiz Kılma

CView sınıfı, yazdırma sırasında çerçeve tarafından çağrılan çeşitli üye işlevlerini tanımlar. Görünüm sınıfınızda bu işlevleri geçersiz kılarak, çerçevenin yazdırma mantığıyla görünüm sınıfınızın yazdırma mantığı arasındaki bağlantıları sağlarsınız. Aşağıdaki tabloda bu üye işlevleri listelenmektedir.

CView'un Yazdırma için Geçersiz Kılınabilir İşlevleri

Ad Geçersiz kılma nedeni
OnPreparePrinting Yazdır iletişim kutusuna, özellikle belgenin uzunluğuna değer eklemek için
OnBeginPrinting Yazı tiplerini veya diğer GDI kaynaklarını ayırmak için
Onpreparedc Belirli bir sayfanın cihaz bağlamının özniteliklerini ayarlamak veya yazdırma zamanı sayfalandırması yapmak için
Onprint Belirli bir sayfayı yazdırmak için
OnEndPrinting GDI kaynaklarını serbest bırakmak için

Yazdırmayla ilgili işlemleri diğer işlevlerde de yapabilirsiniz, ancak bu işlevler yazdırma işlemini yönlendiren işlevlerdir.

Aşağıdaki şekilde, yazdırma işleminde yer alan adımlar gösterilmektedir ve her bir yazdırma üyesi işlevinin CViewnerede çağrıldığı gösterilmektedir. Bu makalenin geri kalanında bu adımların çoğu daha ayrıntılı olarak açıklanmaktadır. Yazdırma işleminin ek bölümleri GDI Kaynaklarını Ayırma makalesinde açıklanmıştır.

Printing loop process.
Yazdırma Döngüsü

Sayfalandırma

Çerçeve, bir yazdırma işi hakkındaki bilgilerin büyük bir kısmını bir CPrintInfo yapısında depolar. Sayfalandırmayla ilgili değerlerden CPrintInfo birkaçı; bu değerlere aşağıdaki tabloda gösterildiği gibi erişilebilir.

CPrintInfo'da Depolanan Sayfa Numarası Bilgileri

Üye değişkeni veya

işlev adları
Başvuruda belirtilen sayfa numarası
GetMinPage/SetMinPage Belgenin ilk sayfası
GetMaxPage/SetMaxPage Belgenin son sayfası
GetFromPage Yazdırılacak ilk sayfa
GetToPage Yazdırılacak son sayfa
m_nCurPage Şu anda yazdırılmakta olan sayfa

Sayfa numaraları 1'de başlar, yani ilk sayfa 0 değil 1 olarak numaralandırılır. Bunlar ve CPrintInfo'nun diğer üyeleri hakkında daha fazla bilgi için bkz. MFC Başvurusu.

Yazdırma işleminin başında, çerçeve görünümün OnPreparePrinting üye işlevini çağırır ve bir CPrintInfo yapıya bir işaretçi geçirir. Uygulama Sihirbazı, öğesinin OnPreparePrinting başka bir üye işlevi CViewolan DoPreparePrinting'i çağıran bir uygulamasını sağlar. DoPreparePrinting , Yazdır iletişim kutusunu görüntüleyen ve yazıcı cihazı bağlamı oluşturan işlevdir.

Bu noktada uygulama belgede kaç sayfa olduğunu bilmez. Belgenin ilk ve son sayfasının numaraları için varsayılan 1 ve 0xFFFF değerlerini kullanır. Belgenizde kaç sayfa olduğunu biliyorsanız, öğesine göndermeden DoPreparePrintingönce yapı için CPrintInfo [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) öğesini geçersiz kılın OnPreparePrinting ve çağırın. Bu, belgenizin uzunluğunu belirtmenize olanak tanır.

DoPreparePrinting ardından Yazdır iletişim kutusunu görüntüler. Döndürdüğünde CPrintInfo , yapı kullanıcı tarafından belirtilen değerleri içerir. Kullanıcı yalnızca seçili bir sayfa aralığını yazdırmak isterse, Yazdır iletişim kutusunda başlangıç ve bitiş sayfa numaralarını belirtebilir. Çerçeve, CPrintInfo'nun GetFromPageve GetToPage işlevlerini kullanarak bu değerleri alır. Kullanıcı bir sayfa aralığı belirtmezse, çerçeve çağırır GetMinPage ve GetMaxPage döndürülen değerleri kullanarak belgenin tamamını yazdırır.

Belgenin yazdırılacak her sayfası için, çerçeve görünüm sınıfınızdaki onPrepareDC ve OnPrint adlı iki üye işlevi çağırır ve her işlevi iki parametre iletir: bir CDC nesnesine işaretçi ve bir CPrintInfo yapıya yönelik işaretçi. Çerçeve ve OnPrint'yi her çağırışındaOnPrepareDC, yapının m_nCurPage üyesinde CPrintInfo farklı bir değer geçirir. Bu şekilde, çerçeve görünüme hangi sayfanın yazdırılacağını söyler.

OnPrepareDC üye işlevi de ekran görüntüsü için kullanılır. Çizim gerçekleşmeden önce cihaz bağlamında ayarlamalar yapar. OnPrepareDC yazdırmada da benzer bir rol üstlenir, ancak birkaç fark vardır: birincisi, CDC nesne ekran cihazı bağlamı yerine bir yazıcı cihazı bağlamını temsil eder ve ikinci olarak nesne CPrintInfo ikinci parametre olarak geçirilir. (Bu parametre Ekran görüntüsü için çağrıldığında OnPrepareDC NULL.) Hangi sayfanın yazdırıldığına bağlı olarak cihaz bağlamında ayarlamalar yapmak için geçersiz kılınOnPrepareDC. Örneğin, belgenin uygun bölümünün yazdırıldığından emin olmak için görünüm penceresi kaynağını ve kırpma bölgesini taşıyabilirsiniz.

OnPrint üye işlevi, sayfanın gerçek yazdırma işlemini gerçekleştirir. Varsayılan Yazdırma Nasıl Yapılır makalesi, çerçevenin yazdırma gerçekleştirmek için bir yazıcı cihazı bağlamı ile OnDraw'u nasıl çağır yaptığını gösterir. Daha net bir şekilde, çerçeve bir CPrintInfo yapı ve cihaz bağlamı ile çağrılar OnPrint ve OnPrint cihaz bağlamını öğesine OnDrawgeçirir. Ekran görüntüsü için değil, yalnızca yazdırma sırasında yapılması gereken tüm işlemeleri gerçekleştirmek için geçersiz kılın OnPrint . Örneğin, üst bilgileri veya alt bilgileri yazdırmak için (daha fazla bilgi için Üst Bilgiler ve Alt Bilgiler makalesine bakın). Ardından, hem ekran görüntüsünde hem de yazdırmada ortak olan işlemeyi yapmak için öğesini geçersiz kılmadan OnPrint çağrısı OnDraw yapın.

Hem ekran görüntüsü hem de yazdırma için işleme işleminin gerçek olması OnDraw , uygulamanızın WYSIWYG olduğu anlamına gelir: "Gördükleriniz elde ettiğiniz şey." Ancak, WYSIWYG uygulaması yazmadığınız varsayılabilir. Örneğin, yazdırma için kalın yazı tipi kullanan ancak ekranda kalın metin belirtmek için denetim kodları görüntüleyen bir metin düzenleyicisi düşünün. Böyle bir durumda, kesinlikle ekran görüntüsü için kullanırsınız OnDraw . öğesini geçersiz kıldığınızda OnPrint, çağrısı OnDraw yerine ayrı bir çizim işlevine yapılan çağrıyı yazın. Bu işlev, ekranda görüntülemediğiniz öznitelikleri kullanarak belgeyi kağıt üzerinde göründüğü gibi çizer.

Yazıcı Sayfaları ve Belge Sayfaları karşılaştırması

Sayfa numaralarına başvururken, bazen yazıcının sayfa kavramıyla belgenin sayfa kavramı arasında ayrım yapmak gerekir. Yazıcının bakış açısından bakıldığında, sayfa bir kağıt sayfasıdır. Ancak, bir kağıt sayfası belgenin bir sayfasına eşit olmayabilir. Örneğin, sayfaların katlanması gereken bir bülten yazdırıyorsanız, bir kağıt sayfası belgenin hem ilk hem de son sayfalarını yan yana içerebilir. Benzer şekilde, elektronik tablo yazdırıyorsanız, belge hiç sayfalardan oluşmaz. Bunun yerine, bir kağıt sayfası 1 ile 20 arasında satır, 6 ile 10 arasında sütunlar içerebilir.

CPrintInfo yapısındaki tüm sayfa numaraları yazıcı sayfalarına başvurur. Çerçeve, yazıcıdan geçecek her kağıt sayfası için ve OnPrint bir kez çağırırOnPrepareDC. Belgenin uzunluğunu belirtmek için OnPreparePrinting işlevini geçersiz kıldığınızda, yazıcı sayfalarını kullanmanız gerekir. Bire bir yazışma varsa (bir yazıcı sayfası bir belge sayfasına eşitse), bu kolay bir işlemdir. Öte yandan, belge sayfaları ve yazıcı sayfaları doğrudan karşılık geliyorsa, bunlar arasında çeviri yapmanız gerekir. Örneğin, elektronik tablo yazdırmayı göz önünde bulundurun. geçersiz kıldığınızda OnPreparePrinting, elektronik tablonun tamamını yazdırmak için kaç sayfa kağıt gerekeceğini hesaplamanız ve ardından öğesinin SetMaxPage üye işlevini CPrintInfoçağırırken bu değeri kullanmanız gerekir. Benzer şekilde, geçersiz kılma OnPrepareDCsırasında m_nCurPage ilgili sayfada görünecek satır ve sütun aralığına çevirmeniz ve ardından görünüm penceresi kaynağını buna göre ayarlamanız gerekir.

Yazdırma Zamanı Sayfalaması

Bazı durumlarda, görünüm sınıfınız belgenin gerçekten yazdırılana kadar ne kadar uzun olduğunu önceden bilmeyebilir. Örneğin, uygulamanızın WYSIWYG olmadığını, dolayısıyla belgenin ekrandaki uzunluğunun yazdırıldığında uzunluğuna karşılık olmadığını varsayalım.

Bu, görünüm sınıfınız için OnPreparePrinting'i geçersiz kıldığınızda bir soruna neden olur: Bir belgenin uzunluğunu bilmediğiniz için CPrintInfo yapısının işlevine bir değer SetMaxPage geçiremezsiniz. Kullanıcı Yazdır iletişim kutusunu kullanırken durdurulacak bir sayfa numarası belirtmezse, çerçeve yazdırma döngüsünün ne zaman durdurulacağını bilmez. Yazdırma döngüsünün ne zaman durdurulacağını belirlemenin tek yolu belgeyi yazdırmak ve ne zaman sona erdiğini görmektir. Görünüm sınıfınız belge yazdırılırken belgenin sonunu denetlemeli ve sona ulaşıldığında çerçeveyi bilgilendirmelidir.

Çerçeve, ne zaman durdurulacağını söylemek için görünüm sınıfınızın OnPrepareDC işlevine dayanır. her çağrısından OnPrepareDCsonra çerçeve, m_bContinuePrinting adlı yapının bir üyesini CPrintInfo denetler. Varsayılan değeri TRUE'dur . Bu şekilde kaldığı sürece, çerçeve yazdırma döngüsüne devam eder. FALSE olarak ayarlanırsa çerçeve durdurulur. Yazdırma zamanı sayfalandırması gerçekleştirmek için, belgenin sonuna ulaşılıp ulaşılmadığını denetlemek için geçersiz kılın OnPrepareDC ve m_bContinuePrintingolduğunda YANLIŞ olarak ayarlayın.

Varsayılan uygulamasıOnPrepareDC,geçerli sayfa 1'den büyükse M_BCONTINUEPRINTING FALSE olarak ayarlanır. Başka bir deyişle, belgenin uzunluğu belirtilmemişse, çerçeve belgenin bir sayfa uzunluğunda olduğunu varsayar. Bunun bir sonucu, temel sınıf sürümünü çağırırsanız dikkatli olmanız gerektiğidir OnPrepareDC. Temel sınıf sürümü çağrıldıktan sonra m_bContinuePrinting TRUE olacağını varsaymayın.

Ne hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Yazdırma
CView Sınıfı
CDC Sınıfı