Cara Mencetak Konten Kontrol Rich Edit
Bagian ini berisi informasi tentang cara mencetak konten kontrol edit yang kaya.
Apa yang perlu Anda ketahui
Teknologi
Prasyarat
- C/C++
- Pemrograman Antarmuka Pengguna Windows
Peraturan
Gunakan Pratinjau Cetak
Untuk memformat teks dalam kontrol pengeditan kaya seperti akan muncul pada perangkat target (biasanya halaman yang dicetak), kirim pesan EM_SETTARGETDEVICE, meneruskan handle ke konteks perangkat (HDC) dari perangkat target dan lebar garis yang diinginkan. Biasanya Anda akan mendapatkan lebar garis dengan memanggil GetDeviceCaps untuk HDC target.
Format Cetak untuk Perangkat Tertentu
Untuk memformat sebagian konten dari kontrol edit yang kaya untuk perangkat tertentu, kirimkan pesan EM_FORMATRANGE. Struktur FORMATRANGE yang digunakan dengan pesan ini menentukan rentang teks yang akan diformat serta HDC untuk perangkat target. Secara opsional, pesan ini juga mengirim teks ke printer.
Gunakan Pita
Pita adalah proses di mana satu halaman output dihasilkan menggunakan satu atau beberapa persegi panjang terpisah, atau pita. Ketika semua bagian ditempatkan di halaman, hasilnya adalah gambar yang lengkap. Pendekatan ini sering digunakan oleh printer raster yang tidak memiliki memori atau kemampuan yang memadai untuk membuat gambar halaman penuh pada satu waktu.
Untuk menerapkan pengelompokan, gunakan pesan EM_DISPLAYBAND untuk mengirim bagian secara berturut-turut dari konten kontrol pengeditan kaya ke perangkat. Pesan ini dicetak ke perangkat yang ditentukan dalam panggilan sebelumnya ke EM_FORMATRANGE. Tentu saja, parameter wParam dari pesan EM_FORMATRANGE harus nol, sehingga pencetakan tidak dimulai oleh pesan tersebut.
Contoh Kode PrintRTF
Contoh kode berikut mencetak isi kontrol edit kaya ke printer yang ditentukan.
// hwnd is the HWND of the rich edit control.
// hdc is the HDC of the printer. This value can be obtained for the
// default printer as follows:
//
// PRINTDLG pd = { sizeof(pd) };
// pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
//
// if (PrintDlg(&pd))
// {
// HDC hdc = pd.hDC;
// ...
// }
BOOL PrintRTF(HWND hwnd, HDC hdc)
{
DOCINFO di = { sizeof(di) };
if (!StartDoc(hdc, &di))
{
return FALSE;
}
int cxPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETX);
int cyPhysOffset = GetDeviceCaps(hdc, PHYSICALOFFSETY);
int cxPhys = GetDeviceCaps(hdc, PHYSICALWIDTH);
int cyPhys = GetDeviceCaps(hdc, PHYSICALHEIGHT);
// Create "print preview".
SendMessage(hwnd, EM_SETTARGETDEVICE, (WPARAM)hdc, cxPhys/2);
FORMATRANGE fr;
fr.hdc = hdc;
fr.hdcTarget = hdc;
// Set page rect to physical page size in twips.
fr.rcPage.top = 0;
fr.rcPage.left = 0;
fr.rcPage.right = MulDiv(cxPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSX));
fr.rcPage.bottom = MulDiv(cyPhys, 1440, GetDeviceCaps(hDC, LOGPIXELSY));
// Set the rendering rectangle to the pintable area of the page.
fr.rc.left = cxPhysOffset;
fr.rc.right = cxPhysOffset + cxPhys;
fr.rc.top = cyPhysOffset;
fr.rc.bottom = cyPhysOffset + cyPhys;
SendMessage(hwnd, EM_SETSEL, 0, (LPARAM)-1); // Select the entire contents.
SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); // Get the selection into a CHARRANGE.
BOOL fSuccess = TRUE;
// Use GDI to print successive pages.
while (fr.chrg.cpMin < fr.chrg.cpMax && fSuccess)
{
fSuccess = StartPage(hdc) > 0;
if (!fSuccess) break;
int cpMin = SendMessage(hwnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr);
if (cpMin <= fr.chrg.cpMin)
{
fSuccess = FALSE;
break;
}
fr.chrg.cpMin = cpMin;
fSuccess = EndPage(hdc) > 0;
}
SendMessage(hwnd, EM_FORMATRANGE, FALSE, 0);
if (fSuccess)
{
EndDoc(hdc);
}
else
{
AbortDoc(hdc);
}
return fSuccess;
}
Topik terkait