Cómo imprimir el contenido de los controles de edición enriquecida
Esta sección contiene información sobre cómo imprimir el contenido de los controles de edición enriquecidos.
Lo que necesita saber
Tecnologías
Requisitos previos
- C/C++
- Programación de la interfaz de usuario de Windows
Instrucciones
Usar vista previa de impresión
Para dar formato al texto en un control de edición enriquecido, ya que aparecerá en un dispositivo de destino (normalmente la página impresa), envíe el mensaje EM_SETTARGETDEVICE , pasando el identificador a un contexto de dispositivo (HDC) del dispositivo de destino y el ancho de línea deseado. Normalmente, obtendrá el ancho de línea llamando a GetDeviceCaps para el HDC de destino.
Formato de impresión para un dispositivo específico
Para dar formato a parte del contenido de un control de edición enriquecido para un dispositivo específico, envíe el mensaje EM_FORMATRANGE . La estructura FORMATRANGE que se usa con este mensaje especifica el intervalo de texto al que se va a dar formato, así como el HDC para el dispositivo de destino. Opcionalmente, este mensaje también envía el texto a la impresora.
Usar bandas
La banda es el proceso por el que se genera una sola página de salida mediante uno o varios rectángulos independientes o bandas. Cuando todas las bandas se colocan en la página, se obtiene un resultado de imagen completo. A menudo, las impresoras ráster usan este enfoque que no tienen suficiente memoria ni capacidad para crear imágenes de una página completa a la vez.
Para implementar bandas, use el mensaje EM_DISPLAYBAND para enviar partes sucesivas del contenido del control de edición enriquecido al dispositivo. Este mensaje imprime en el dispositivo que se especificó en una llamada anterior a EM_FORMATRANGE. Por supuesto, el parámetro wParam del mensaje EM_FORMATRANGE debe ser cero, de modo que la impresión no se inicie mediante ese mensaje.
Ejemplo de código printRTF
En el código de ejemplo siguiente se imprime el contenido de un control de edición enriquecido en la impresora especificada.
// 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;
}
Temas relacionados