Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan protokol pencetakan Windows dan menjelaskan cara mencetak dokumen yang berisi lebih dari satu halaman. Artikel ini membahas topik berikut:
Protokol untuk Pencetakan
Untuk mencetak dokumen multipage, 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 pagination saat pencetakan. |
| OnPrint | Untuk mencetak halaman tertentu |
| OnEndPrinting | Untuk menonaktifkan 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.
Siklus Pencetakan
Pengaturan halaman
Kerangka kerja menyimpan banyak informasi tentang pekerjaan cetak dalam struktur CPrintInfo . Beberapa nilai dalam CPrintInfo berkaitan dengan penomoran halaman; nilai-nilai ini dapat diakses seperti yang ditunjukkan 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, framework memanggil fungsi anggota OnPreparePrinting tampilan tersebut, 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, ganti OnPreparePrinting dan panggil [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) untuk struktur CPrintInfo sebelum Anda mengirimnya ke DoPreparePrinting. Ini memungkinkan Anda menentukan panjang dokumen Anda.
DoPreparePrinting lalu menampilkan kotak dialog Cetak. Saat dikembalikan, struktur CPrintInfo 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 fungsi GetFromPage dan GetToPage dari CPrintInfo. Jika pengguna tidak menentukan rentang halaman, kerangka kerja memanggil GetMinPage dan GetMaxPage dan menggunakan nilai yang dikembalikan untuk mencetak seluruh dokumen.
Untuk setiap halaman dokumen yang akan dicetak, kerangka kerja memanggil dua fungsi anggota di kelas tampilan Anda, OnPrepareDC dan OnPrint, dan meneruskan dua parameter ke setiap fungsi: penunjuk ke objek CDC dan penunjuk ke struktur CPrintInfo. Setiap kali kerangka kerja memanggil OnPrepareDC dan OnPrint, kerangka kerja melewati nilai yang berbeda dalam anggota m_nCurPage dari CPrintInfo struktur. 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 penggambaran dimulai.
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 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 titik asal tampilan dan area kliping untuk memastikan bahwa bagian dokumen yang sesuai akan dicetak.
Fungsi anggota OnPrint melakukan pencetakan halaman yang sebenarnya. Artikel Bagaimana Pencetakan Default Dilakukan 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 penggantian OnPrint untuk melakukan penyajian yang umum untuk tampilan layar dan pencetakan.
Fakta bahwa OnDraw melakukan rendering untuk tampilan layar dan pencetakan yang berarti aplikasi Anda adalah WYSIWYG: "Apa yang Anda lihat adalah apa yang Anda dapatkan." Namun, jika 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 mengganti OnPrint, ganti panggilan OnDraw dengan panggilan ke fungsi terpisah untuk menggambar. 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 tentang halaman menurut printer dan konsep tentang halaman menurut dokumen. 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 melakukan penerjemahan antara halaman-halaman tersebut. Misalnya, pertimbangkan untuk mencetak spreadsheet. id-ID: Saat menggantikan OnPreparePrinting, Anda harus menghitung berapa banyak lembar kertas yang diperlukan untuk mencetak seluruh lembar bentang dan kemudian menggunakan nilai tersebut saat memanggil fungsi anggota SetMaxPage dari CPrintInfo. Demikian pula, saat melakukan override OnPrepareDC, Anda harus menerjemahkan m_nCurPage ke dalam rentang baris dan kolom yang akan muncul pada lembar tertentu dan kemudian menyesuaikan titik asal viewport yang sesuai.
Print-Time Penomoran halaman
Dalam beberapa situasi, kelas tampilan Anda mungkin tidak tahu terlebih dahulu panjang dokumen hingga benar-benar dicetak. Misalnya, aplikasi Anda bukan WYSIWYG, sehingga panjang dokumen di layar tidak sesuai dengan panjangnya saat dicetak.
Ini menyebabkan masalah saat Anda menggantikan OnPreparePrinting untuk kelas tampilan Anda: Anda tidak dapat meneruskan nilai ke fungsi SetMaxPage dari struktur CPrintInfo karena panjang dokumen tidak diketahui. 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 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 melanjutkan siklus pencetakan. Jika diatur ke FALSE, kerangka kerja akan berhenti. Untuk melakukan penomoran halaman saat mencetak, timpa OnPrepareDC untuk memeriksa apakah akhir dokumen telah tercapai, dan atur m_bContinuePrinting ke FALSE ketika telah mencapai akhir dokumen.
Implementasi OnPrepareDC standar mengatur nilai m_bContinuePrinting ke FALSE jika halaman saat ini lebih 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 berasumsi bahwa m_bContinuePrinting akan TRUE setelah memanggil versi kelas dasar.