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;
    
}

Usar controles de edición enriquecida

Demostración de controles comunes de Windows (CppWindowsCommonControls)