ストリームを使用する方法

ストリームを使用して、リッチ エディット コントロールとの間でデータを転送できます。 ストリームは、バッファーとアプリケーション定義のコールバック関数を指定する EDITSTREAM 構造体によって定義されます。

リッチ エディット コントロールにデータを読み取る (つまり、データをストリーミングする) には、EM_STREAMIN メッセージを使用します 。 コントロールはアプリケーションのコールバック関数を繰り返し呼び出して、そのたびにデータの一部をバッファーに転送します。

リッチ エディット コントロールの内容を保存する (つまり、データをストリーミングする) には、EM_STREAMOUT メッセージを使用できます 。 コントロールは、バッファーへの書き込みを繰り返して、アプリケーションのコールバック関数を呼び出します。 コールバック関数は、呼び出しごとに、バッファーの内容を保存します。

知っておくべきこと

テクノロジ

前提条件

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

手順

ストリームの使用

次のコード例は、.rtf ファイルをリッチ エディット コントロールに読み取る方法を示しています。 ファイル ハンドルは、EDITSTREAM 構造の dwCookie メンバーを介してコールバック関数に渡されます。

DWORD CALLBACK EditStreamCallback(DWORD_PTR dwCookie, 
                                  LPBYTE lpBuff,
                                  LONG cb, 
                                  PLONG pcb)
{
    HANDLE hFile = (HANDLE)dwCookie;
    
    if (ReadFile(hFile, lpBuff, cb, (DWORD *)pcb, NULL)) 
    {
        return 0;
    }
    
    return -1;
}

BOOL FillRichEditFromFile(HWND hwnd, LPCTSTR pszFile)
{
    BOOL fSuccess = FALSE;
    
    HANDLE hFile = CreateFile(pszFile, GENERIC_READ, 
                              FILE_SHARE_READ, 0, OPEN_EXISTING,
                              FILE_FLAG_SEQUENTIAL_SCAN, NULL);
        
    if (hFile != INVALID_HANDLE_VALUE) 
    {
        EDITSTREAM es = { 0 };
        
        es.pfnCallback = EditStreamCallback;
        es.dwCookie    = (DWORD_PTR)hFile;
        
        if (SendMessage(hwnd, EM_STREAMIN, SF_RTF, (LPARAM)&es) && es.dwError == 0) 
        {
                fSuccess = TRUE;
        }
        
        CloseHandle(hFile);
    }
    
    return fSuccess;
    
}

リッチ エディット コントロールの使用

Windows コモン コントロールのデモ (CppWindowsCommonControls)