Partager via


Comment imprimer le contenu des contrôles d’édition enrichis

Cette section contient des informations sur l’impression du contenu des contrôles d’édition enrichis.

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Programmation de l’interface utilisateur Windows

Instructions

Utiliser l’aperçu avant impression

Pour mettre en forme du texte dans un contrôle d’édition enrichi tel qu’il apparaîtra sur un appareil cible (généralement la page imprimée), envoyez le message EM_SETTARGETDEVICE , en passant le handle à un contexte d’appareil (HDC) de l’appareil cible et la largeur de ligne souhaitée. En règle générale, vous obtiendrez la largeur de ligne en appelant GetDeviceCaps pour le HDC cible.

Mettre en forme l’impression pour un appareil spécifique

Pour mettre en forme une partie du contenu d’un contrôle d’édition enrichi pour un appareil spécifique, envoyez le message EM_FORMATRANGE . La structure FORMATRANGE utilisée avec ce message spécifie la plage de texte à mettre en forme, ainsi que le HDC pour l’appareil cible. Si vous le souhaitez, ce message envoie également le texte à l’imprimante.

Utiliser le bandage

La bande est le processus par lequel une seule page de sortie est générée à l’aide d’un ou plusieurs rectangles distincts, ou bandes. Lorsque toutes les bandes sont placées sur la page, une image complète est générée. Cette approche est souvent utilisée par les imprimantes raster qui ne disposent pas d’une mémoire ou d’une capacité suffisante pour imager une page entière à la fois.

Pour implémenter le banding, utilisez le message EM_DISPLAYBAND pour envoyer des parties successives du contenu du contrôle d’édition enrichi à l’appareil. Ce message s’affiche sur l’appareil spécifié lors d’un appel précédent à EM_FORMATRANGE. Bien entendu, le paramètre wParam du message EM_FORMATRANGE doit être égal à zéro, afin que l’impression ne soit pas initiée par ce message.

Exemple de code PrintRTF

L’exemple de code suivant imprime le contenu d’un contrôle d’édition enrichi sur l’imprimante spécifiée.

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

Utilisation de contrôles d’édition enrichie

Démonstration des contrôles communs Windows (CppWindowsCommonControls)