リッチ エディット コントロールの内容を印刷する方法

このセクションでは、リッチ エディット コントロールの内容を印刷する方法について説明します。

知っておくべきこと

テクノロジ

前提条件

  • C/C++
  • Windows ユーザー インターフェイス プログラミング

手順

印刷プレビューを使用する

ターゲット デバイス (通常は印刷されたページ) に表示されるようにリッチエディット コントロールのテキストを書式設定するには、EM_SETTARGETDEVICE メッセージを送信し、ターゲット デバイスのデバイス コンテキスト (HDC) と目的の行幅にハンドルを渡します。 通常、ターゲット HDC に対して GetDeviceCaps を呼び出して、行幅を取得します。

特定のデバイスの印刷形式

リッチ エディット コントロールのコンテンツの一部を特定のデバイス用に書式設定するには、EM_FORMATRANGE メッセージを送信します。 このメッセージで使用される FORMATRANGE 構造体は、書式設定するテキストの範囲と、ターゲット デバイスの HDC を指定します。 必要に応じて、このメッセージはプリンターにもテキストを送信します。

バンディングを使用する

バンディングは、1 つまたは複数の個別の矩形またはバンドを使用して 1 ページの出力を生成するプロセスです。 すべてのバンドがページに配置されると、完全な画像が表示されます。 この方法は多くの場合、一度に完全なページをイメージするのに十分なメモリや機能がないラスター プリンターで使用されます。

バンディングを実装するには、EM_DISPLAYBAND メッセージを使用して、リッチ エディット コントロールのコンテンツの連続する部分をデバイスに送信します。 このメッセージは、EM_FORMATRANGE の前回の呼び出しで指定されたデバイスに出力されます。 EM_FORMATRANGE メッセージの wParam パラメーターは 0 にする必要があり、これにより、メッセージによって印刷が開始されません。

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)