Как распечатать содержимое элементов управления Rich Edit
В этом разделе содержатся сведения о том, как распечатать содержимое элементов управления с расширенными возможностями редактирования.
Что нужно знать
Технологии
Необходимые условия
- C/C++
- Программирование пользовательского интерфейса Windows
Инструкции
Использование предварительной версии печати
Чтобы отформатировать текст в элементе управления с расширенным редактированием так, как он будет отображаться на целевом устройстве (обычно на печатной странице), отправьте сообщение EM_SETTARGETDEVICE, передавая дескриптор контекста устройства (HDC) целевого устройства и желаемой ширины строки. Обычно ширина линии будет получена путем вызова GetDeviceCaps для целевого HDC.
Форматирование печати для конкретного устройства
Чтобы отформатировать часть содержимого элемента управления расширенного редактирования для определенного устройства, отправьте сообщение EM_FORMATRANGE. Структура FORMATRANGE, используемая с этим сообщением, указывает диапазон текста для форматирования, а также HDC для целевого устройства. При необходимости это сообщение также отправляет текст на принтер.
Использование полосы
Процесс полосной обработки — это создание одной страницы выходных данных с использованием одного или нескольких отдельных прямоугольников, или полос. Когда все полосы помещены на страницу, получается полное изображение. Этот подход часто используется растерными принтерами, которые не имеют достаточного объема памяти или возможности одновременного изображения полной страницы.
Чтобы реализовать сегментирование, используйте сообщение EM_DISPLAYBAND для отправки последовательных частей содержимого элемента управления расширенным текстом на устройство. Это сообщение выводится на устройство, указанное в предыдущем вызове EM_FORMATRANGE. Конечно, параметр wParam сообщения EM_FORMATRANGE должен быть нулевым, поэтому печать не инициируется этим сообщением.
Пример кода PrintRTF
В следующем примере кода выводится содержимое элемента управления расширенными изменениями на указанный принтер.
// 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;
}
Связанные разделы
-
Использование элементов управления расширенного редактирования
-
демонстрация общих элементов управления Windows (CppWindowsCommonControls)