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 CView
fungsi 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.
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 OnPrint
alih , 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.