Jak wydrukować zawartość kontrolek edycji wzbogaconej
Ta sekcja zawiera informacje o sposobie drukowania zawartości kontrolek edycji wzbogaconej.
Co musisz wiedzieć
Technologie
Warunki wstępne
- C/C++
- Programowanie interfejsu użytkownika systemu Windows
Instrukcje
Korzystanie z podglądu wydruku
Aby sformatować tekst w kontrolce edycji sformatowanej, która będzie wyświetlana na urządzeniu docelowym (zazwyczaj na drukowanej stronie), wyślij komunikat EM_SETTARGETDEVICE, przekazując uchwyt do kontekstu urządzenia docelowego (HDC) i żądaną szerokość wiersza. Zazwyczaj można uzyskać szerokość linii, wywołując GetDeviceCaps dla docelowego HDC.
Formatowanie drukowania dla określonego urządzenia
Aby sformatować część zawartości kontrolki edycji wzbogaconej dla określonego urządzenia, wyślij komunikat EM_FORMATRANGE. Struktura FORMATRANGE używana z tym komunikatem określa zakres tekstu do formatowania, a także HDC dla urządzenia docelowego. Opcjonalnie ten komunikat również wysyła tekst do drukarki.
Korzystanie z bandingu
Pasmowanie to proces, za pomocą którego generowana jest pojedyncza strona danych wyjściowych przy użyciu jednego lub więcej oddzielnych prostokątów lub pasm. Gdy wszystkie pasma są umieszczone na stronie, tworzy się kompletny obraz. Takie podejście jest często używane przez drukarki rasterowe, które nie mają wystarczającej ilości pamięci lub możliwości jednoczesnego tworzenia obrazu pełnej strony.
Aby zaimplementować banding, użyj komunikatu EM_DISPLAYBAND, aby wysłać kolejne części zawartości kontrolki Rich Edit do urządzenia. Ten komunikat jest wyświetlany na urządzeniu określonym w poprzednim wywołaniu EM_FORMATRANGE. Oczywiście parametr wParam komunikatu EM_FORMATRANGE powinien mieć wartość zero, więc drukowanie nie jest inicjowane przez ten komunikat.
Przykład kodu PrintRTF
Poniższy przykładowy kod drukuje zawartość kontrolki Rich Edit na określoną drukarkę.
// 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;
}
Tematy pokrewne