Drucken des Inhalts von Rich Edit-Steuerelementen

Dieser Abschnitt enthält Informationen zum Drucken des Inhalts von Rich-Edit-Steuerelementen.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Windows Benutzeroberfläche-Programmierung

Instructions

Verwenden der Seitenansicht

Um Text in einem Rich-Edit-Steuerelement so zu formatieren, wie er auf einem Zielgerät (normalerweise auf der gedruckten Seite) angezeigt wird, senden Sie die EM _ SETTARGETDEVICE-Nachricht, und übergeben Sie das Handle an einen Gerätekontext (HDC) des Zielgeräts und die gewünschte Linienbreite. In der Regel erhalten Sie die Linienbreite, indem Sie GetDeviceCaps für das HDC-Ziel aufrufen.

Formatdruck für ein bestimmtes Gerät

Um einen Teil des Inhalts eines Rich-Edit-Steuerelements für ein bestimmtes Gerät zu formatieren, senden Sie die EM _ FORMATRANGE-Nachricht. Die FORMATRANGE-Struktur, die mit dieser Meldung verwendet wird, gibt den zu formatierten Textbereich sowie den HDC für das Zielgerät an. Optional sendet diese Nachricht auch den Text an den Drucker.

Verwenden von Banding

Banding ist der Prozess, bei dem eine einzelne Seite der Ausgabe mit einem oder mehr separaten Rechtecke oder Bändern generiert wird. Wenn alle Bänder auf der Seite platziert werden, wird ein vollständiges Bild angezeigt. Dieser Ansatz wird häufig von Rasterdruckern verwendet, die nicht über genügend Arbeitsspeicher verfügen oder eine vollständige Seite gleichzeitig erstellen können.

Um banding zu implementieren, verwenden Sie die EM _ DISPLAYBAND-Nachricht, um aufeinander folgende Teile des Rich Edit-Steuerelementinhalts an das Gerät zu senden. Diese Meldung wird auf dem Gerät gedruckt, das in einem vorherigen Aufruf von EM _ FORMATRANGE angegeben wurde. Natürlich sollte der wParam-Parameter der EM _ FORMATRANGE-Nachricht 0 (null) sein, damit das Drucken nicht von dieser Nachricht initiiert wird.

PrintRTF-Codebeispiel

Der folgende Beispielcode gibt den Inhalt eines Rich-Edit-Steuerelements auf dem angegebenen Drucker aus.

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

Verwenden von Rich Edit-Steuerelementen

Windows demo (CppWindowsCommonControls)