RichEdit から EM_STREAMOUT で出力

DialogBox の RichEdit から EM_STREAMOUT で TEXT FILE に直接出力します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. RichEdit で編集したデータを EM_STREAMOUT で TEXT FILE に直接出力します。
    LPSTR g_buf で定義したデータを RichEdit に表示する手順は RichEdit に TEXT を表示 を参照して下さい。
  2. WM_CLOSE: から RichEdit で編集したデータを直接ファイルに出力する関数 Save() を呼び出します。
            case WM_CLOSE:
                Save();
                EndDialog(hDlg,TRUE);
                return TRUE;
    
  3. Save() 関数では、HANDLE をオープンして EM_STREAMOUT を実行します。
    このとき EDITSTREAM の dwCookie に HANDLE を、pfnCallback に CALLBACK 関数を設定して下さい。
    TEXT FILE のときは SF_TEXT を、RichEdit FILE のときは SF_RTF を指定します。
    VOID Save()
    {
        EDITSTREAM es;
        HANDLE     hFile;
    
        hFile = CreateFile("save.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL |  FILE_FLAG_WRITE_THROUGH, NULL);
        // EDITSTREAM構造体を設定する。
        es.dwCookie = (DWORD)hFile;
        es.dwError  = 0;
        es.pfnCallback = SaveProc;
    
        // ファイルにデータを保存する。
        SendMessage(g_hEdit, EM_STREAMOUT, SF_TEXT, (LPARAM)&es);
    
        // 変更フラグをクリアする。
        SendMessage(g_hEdit, EM_SETMODIFY, 0, 0);
        CloseHandle(hFile);
    }
    
  4. RichEdit から呼び出される CALLBACK 関数です。
    ここで WriteFile() 関数を使ってデータをファイルに出力します。
    データは、適当なサイズに分けられて、何度か送られてきます。
    return( FALSE ); は失敗ではなく、ゼロをリターンしています。
    中止するときは「非ゼロ」をリターンします。
    DWORD CALLBACK SaveProc(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
    {
        if (WriteFile((HANDLE)dwCookie, pbBuff, cb, (DWORD*)pcb, NULL)) return(TRUE);
        return( FALSE );
    }
    

超初心者のプログラム入門(Win32API C++)