Bagikan melalui


Mengalikan Dokumen

Artikel ini menjelaskan protokol pencetakan Windows dan menjelaskan cara mencetak dokumen yang berisi lebih dari satu halaman. Artikel ini membahas topik berikut:

Protokol Pencetakan

Untuk mencetak dokumen perkalian, kerangka kerja dan tampilan berinteraksi dengan cara berikut. Pertama, kerangka kerja menampilkan kotak dialog Cetak , membuat konteks perangkat untuk printer, dan memanggil fungsi anggota StartDoc dari objek CDC . Kemudian, untuk setiap halaman dokumen, kerangka kerja memanggil fungsi anggota StartPage objek CDC , menginstruksikan objek tampilan untuk mencetak halaman, dan memanggil fungsi anggota EndPage . Jika mode printer harus diubah sebelum memulai halaman tertentu, tampilan memanggil ResetDC, yang memperbarui struktur DEVMODE yang berisi informasi mode printer baru. Ketika seluruh dokumen telah dicetak, kerangka kerja memanggil fungsi anggota EndDoc .

Mengesampingkan Fungsi Kelas Tampilan

Kelas CView mendefinisikan beberapa fungsi anggota yang dipanggil oleh kerangka kerja selama pencetakan. Dengan mengesampingkan fungsi-fungsi ini di kelas tampilan, Anda menyediakan koneksi antara logika pencetakan kerangka kerja dan logika pencetakan kelas tampilan Anda. Tabel berikut mencantumkan fungsi anggota ini.

Fungsi yang Dapat Diganti CView untuk Pencetakan

Nama Alasan penimpaan
OnPreparePrinting Untuk menyisipkan nilai dalam kotak dialog Cetak, terutama panjang dokumen
OnBeginPrinting Untuk mengalokasikan font atau sumber daya GDI lainnya
OnPrepareDC Untuk menyesuaikan atribut konteks perangkat untuk halaman tertentu, atau untuk melakukan penomoran halaman waktu cetak
OnPrint Untuk mencetak halaman tertentu
OnEndPrinting Untuk membatalkan alokasi sumber daya GDI

Anda juga dapat melakukan pemrosesan terkait pencetakan di fungsi lain, tetapi fungsi-fungsi ini adalah yang mendorong proses pencetakan.

Gambar berikut mengilustrasikan langkah-langkah yang terlibat dalam proses pencetakan dan menunjukkan di mana setiap CViewfungsi anggota pencetakan dipanggil. Sisa artikel ini menjelaskan sebagian besar langkah-langkah ini secara lebih rinci. Bagian tambahan dari proses pencetakan dijelaskan dalam artikel Mengalokasikan Sumber Daya GDI.

Printing loop process.
Perulangan Pencetakan

Paginasi

Kerangka kerja menyimpan banyak informasi tentang pekerjaan cetak dalam struktur CPrintInfo . Beberapa nilai berkaitan dengan penomoran halaman; nilai-nilai ini dapat diakses seperti yang ditunjukkan CPrintInfo dalam tabel berikut.

Informasi Nomor Halaman Yang Disimpan di CPrintInfo

Variabel anggota atau

nama fungsi
Nomor halaman yang dirujuk
GetMinPage/SetMinPage Halaman pertama dokumen
GetMaxPage/SetMaxPage Halaman terakhir dokumen
GetFromPage Halaman pertama yang akan dicetak
GetToPage Halaman terakhir yang akan dicetak
m_nCurPage Halaman sedang dicetak

Nomor halaman dimulai dari 1, yaitu, halaman pertama bernomor 1, bukan 0. Untuk informasi selengkapnya tentang ini dan anggota CPrintInfo lainnya, lihat Referensi MFC.

Di awal proses pencetakan, kerangka kerja memanggil fungsi anggota OnPreparePrinting tampilan, meneruskan penunjuk ke CPrintInfo struktur. Panduan Aplikasi menyediakan implementasi OnPreparePrinting yang memanggil DoPreparePrinting, fungsi anggota lain dari CView. DoPreparePrinting adalah fungsi yang menampilkan kotak dialog Cetak dan membuat konteks perangkat printer.

Pada titik ini aplikasi tidak tahu berapa banyak halaman dalam dokumen. Ini menggunakan nilai default 1 dan 0xFFFF untuk jumlah halaman pertama dan terakhir dokumen. Jika Anda tahu berapa banyak halaman yang dimiliki dokumen Anda, ambil alih OnPreparePrinting dan panggil [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) untuk CPrintInfo struktur sebelum Anda mengirimkannya ke DoPreparePrinting. Ini memungkinkan Anda menentukan panjang dokumen Anda.

DoPreparePrinting lalu menampilkan kotak dialog Cetak. Saat dikembalikan, CPrintInfo struktur berisi nilai yang ditentukan oleh pengguna. Jika pengguna hanya ingin mencetak rentang halaman yang dipilih, dia dapat menentukan nomor halaman awal dan akhir dalam kotak dialog Cetak. Kerangka kerja mengambil nilai-nilai ini menggunakan GetFromPage fungsi dan GetToPage CPrintInfo. Jika pengguna tidak menentukan rentang halaman, kerangka kerja memanggil GetMinPage dan GetMaxPage dan menggunakan nilai yang dikembalikan untuk mencetak seluruh dokumen.

Agar setiap halaman dokumen dicetak, kerangka kerja memanggil dua fungsi anggota di kelas tampilan Anda, OnPrepareDC dan OnPrint, dan meneruskan setiap parameter fungsi dua: penunjuk ke objek CDC dan penunjuk ke CPrintInfo struktur. Setiap kali kerangka kerja memanggil OnPrepareDC dan OnPrint, kerangka kerja melewati nilai yang berbeda dalam anggota CPrintInfo struktur m_nCurPage. Dengan cara ini kerangka kerja memberi tahu tampilan halaman mana yang harus dicetak.

Fungsi anggota OnPrepareDC juga digunakan untuk tampilan layar. Ini membuat penyesuaian pada konteks perangkat sebelum gambar terjadi. OnPrepareDC menyajikan peran serupa dalam pencetakan, tetapi ada beberapa perbedaan: pertama, CDC objek mewakili konteks perangkat printer alih-alih konteks perangkat layar, dan kedua, CPrintInfo objek diteruskan sebagai parameter kedua. (Parameter ini adalah NULL ketika OnPrepareDC dipanggil untuk tampilan layar.) Ambil alih OnPrepareDC untuk membuat penyesuaian pada konteks perangkat berdasarkan halaman mana yang sedang dicetak. Misalnya, Anda dapat memindahkan asal viewport dan wilayah kliping untuk memastikan bahwa bagian dokumen yang sesuai akan dicetak.

Fungsi anggota OnPrint melakukan pencetakan halaman yang sebenarnya. Artikel Cara Pencetakan Default Selesai memperlihatkan bagaimana kerangka kerja memanggil OnDraw dengan konteks perangkat printer untuk melakukan pencetakan. Lebih tepatnya, kerangka kerja memanggil OnPrint dengan CPrintInfo struktur dan konteks perangkat, dan OnPrint meneruskan konteks perangkat ke OnDraw. Ambil alih OnPrint untuk melakukan penyajian apa pun yang harus dilakukan hanya selama pencetakan dan bukan untuk tampilan layar. Misalnya, untuk mencetak header atau footer (lihat artikel Header dan Footer untuk informasi selengkapnya). Kemudian panggil OnDraw dari penimpaan OnPrint untuk melakukan penyajian umum ke tampilan layar dan pencetakan.

Fakta bahwa OnDraw penyajian untuk tampilan layar dan pencetakan berarti bahwa aplikasi Anda adalah WYSIWYG: "Apa yang Anda lihat adalah apa yang Anda dapatkan." Namun, misalkan Anda tidak menulis aplikasi WYSIWYG. Misalnya, pertimbangkan editor teks yang menggunakan font tebal untuk pencetakan tetapi menampilkan kode kontrol untuk menunjukkan teks tebal di layar. Dalam situasi seperti itu, Anda menggunakan OnDraw secara ketat untuk tampilan layar. Saat Anda mengambil OnPrintalih , ganti panggilan ke OnDraw dengan panggilan ke fungsi gambar terpisah. Fungsi tersebut menggambar dokumen seperti yang muncul di kertas, menggunakan atribut yang tidak Anda tampilkan di layar.

Halaman Printer vs. Halaman Dokumen

Saat Anda merujuk ke nomor halaman, terkadang perlu membedakan antara konsep printer halaman dan konsep dokumen halaman. Dari sudut pandang printer, halaman adalah satu lembar kertas. Namun, satu lembar kertas tidak selalu sama dengan satu halaman dokumen. Misalnya, jika Anda mencetak buletin, di mana lembar akan dilipat, satu lembar kertas mungkin berisi halaman pertama dan terakhir dokumen, berdampingan. Demikian pula, jika Anda mencetak spreadsheet, dokumen tidak terdiri dari halaman sama sekali. Sebagai gantinya, satu lembar kertas mungkin berisi baris 1 hingga 20, kolom 6 hingga 10.

Semua nomor halaman dalam struktur CPrintInfo merujuk ke halaman printer. Kerangka kerja memanggil OnPrepareDC dan OnPrint sekali untuk setiap lembar kertas yang akan melewati printer. Ketika Anda mengambil alih fungsi OnPreparePrinting untuk menentukan panjang dokumen, Anda harus menggunakan halaman printer. Jika ada korespondensi satu-ke-satu (yaitu, satu halaman printer sama dengan satu halaman dokumen), maka ini mudah. Jika, di sisi lain, halaman dokumen dan halaman printer tidak secara langsung sesuai, Anda harus menerjemahkan di antara halaman tersebut. Misalnya, pertimbangkan untuk mencetak spreadsheet. Saat mengambil alih OnPreparePrinting, Anda harus menghitung berapa banyak lembar kertas yang akan diperlukan untuk mencetak seluruh lembar bentang dan kemudian menggunakan nilai tersebut SetMaxPage saat memanggil fungsi anggota .CPrintInfo Demikian pula, saat menimpa OnPrepareDC, Anda harus menerjemahkan m_nCurPage ke dalam rentang baris dan kolom yang akan muncul pada lembar tertentu dan kemudian menyesuaikan asal viewport yang sesuai.

Penomoran Halaman Waktu Cetak

Dalam beberapa situasi, kelas tampilan Anda mungkin tidak tahu terlebih dahulu berapa lama dokumen sampai benar-benar telah dicetak. Misalnya, aplikasi Anda bukan WYSIWYG, sehingga panjang dokumen di layar tidak sesuai dengan panjangnya saat dicetak.

Ini menyebabkan masalah saat Anda mengambil alih OnPreparePrinting untuk kelas tampilan Anda: Anda tidak dapat meneruskan nilai ke SetMaxPage fungsi struktur CPrintInfo , karena Anda tidak tahu panjang dokumen. Jika pengguna tidak menentukan nomor halaman untuk berhenti menggunakan kotak dialog Cetak, kerangka kerja tidak tahu kapan harus menghentikan perulangan cetak. Satu-satunya cara untuk menentukan kapan menghentikan perulangan cetak adalah dengan mencetak dokumen dan melihat kapan dokumen berakhir. Kelas tampilan Anda harus memeriksa akhir dokumen saat sedang dicetak, lalu menginformasikan kerangka kerja saat akhir tercapai.

Kerangka kerja bergantung pada fungsi OnPrepareDC kelas tampilan Anda untuk memberi tahu kapan harus berhenti. Setelah setiap panggilan ke OnPrepareDC, kerangka kerja memeriksa anggota struktur yang CPrintInfo disebut m_bContinuePrinting. Nilai defaultnya adalah TRUE. Selama tetap demikian, kerangka kerja melanjutkan perulangan cetak. Jika diatur ke FALSE, kerangka kerja akan berhenti. Untuk melakukan penomoran halaman waktu cetak, ambil alih OnPrepareDC untuk memeriksa apakah akhir dokumen telah tercapai, dan atur m_bContinuePrinting ke FALSE saat dokumen memilikinya.

Implementasi OnPrepareDC default set m_bContinuePrinting ke FALSE jika halaman saat ini lebih besar dari 1. Ini berarti bahwa jika panjang dokumen tidak ditentukan, kerangka kerja mengasumsikan dokumen panjangnya satu halaman. Salah satu konsekuensi dari ini adalah Bahwa Anda harus berhati-hati jika Anda memanggil versi kelas dasar dari OnPrepareDC. Jangan asumsikan bahwa m_bContinuePrinting akan TRUE setelah memanggil versi kelas dasar.

Apa yang ingin Anda ketahui lebih lanjut tentang

Baca juga

Percetakan
Kelas CView
Kelas CDC