Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
| İsim | 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.
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ı |
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ı, OnPreparePrinting üyesi olan başka bir işlev DoPreparePrinting'i çağıran CView'nin 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, OnPreparePrinting öğesini geçersiz kılın ve CPrintInfo yapısı için [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) öğesini çağırın, sonra DoPreparePrinting öğesine göndermeden önce bunları yapın. Bu, belgenizin uzunluğunu belirtmenize olanak tanır.
DoPreparePrinting ardından Yazdır iletişim kutusunu görüntüler.
CPrintInfo yapısı geri döndüğünde, 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, GetFromPageGetToPage ve işlevlerini kullanarak bu değerleri alır. Kullanıcı bir sayfa aralığı belirtmezse, çatı GetMinPage ve GetMaxPage çağırır ve 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 her çağırıldığında OnPrepareDC ve OnPrint, yapının m_nCurPage üyesinde farklı bir değer aktarır CPrintInfo. 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. (Ekran görüntüsü için çağrıldığında bu parametre OnPrepareDC olur.) 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 OnPrint yapısı ve cihaz bağlamı ile CPrintInfo işlevini çağırır ve OnPrint, cihaz bağlamını OnDraw öğesine geçirir. Yalnızca yazdırma sırasında yapılması gereken tüm işlemleri gerçekleştirmek için OnPrint'i geçersiz kılın, ekran görüntüsü için değil. Ö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ü hem de yazdırma için ortak olan işlemi gerçekleştirmek amacıyla OnDraw öğesinin geçersiz kılmasından OnPrint öğesini çağırın.
**
OnDraw'in hem ekran hem de yazdırma için işlemi gerçekleştirmesi, uygulamanızın WYSIWYG prensibiyle çalıştığı anlamına gelir: "Ne görüyorsanız onu alırsınız." Ancak, WYSIWYG bir uygulama yazmıyorsanız varsayalım ki. Ö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, OnDraw'yu kesinlikle ekran gösterimi için kullanırsınız. Siz OnPrint öğesini geçersiz kıldığınızda, OnDraw çağrısını ayrı bir çizim işlevine yapılan bir çağrı ile değiştirin. 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 OnPrepareDC ve OnPrint bir kez çağırır. 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 gelmiyorsa, bunlar arasında çeviri yapmanız gerekir. Örneğin, bir elektronik tablo yazdırmayı düşünün. 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.
Print-Time Sayfalandırma
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 SetMaxPage yapısının işlevine bir değer 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 OnPrepareDC çağrısından sonra, çerçeve, CPrintInfo yapısının m_bContinuePrinting adlı üyesini 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ını gerçekleştirmek için, belgenin sonuna ulaşılıp ulaşılmadığını kontrol etmek üzere OnPrepareDC'yi geçersiz kılın ve sonuna ulaşıldığında m_bContinuePrinting'i YANLIŞ olarak ayarlayın.
Varsayılan uygulama, geçerli sayfa 1'den büyükse, OnPrepareDC'i FALSE olarak ayarlar. 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_bContinuePrintingTRUE olacağını varsaymayın.