如何使用流

可以使用数据流将数据传入或传出 Rich Edit 控件。 流由 EDITSTREAM 结构定义,其指定缓冲区和应用程序定义的回调函数。

要将数据读入 Rich Edit 控件(即流式传入数据),请使用 EM_STREAMIN 消息。 该控件会重复调用应用程序的回调函数,每次都会将部分数据传输到缓冲区中。

要保存 Rich Edit 控件的内容(即流式传出数据),可以使用 EM_STREAMOUT 消息。 控件会反复向缓冲区写入数据,然后调用应用程序的回调函数。 对于每个调用,回调函数将保存缓冲区的内容。

需要了解的事项

技术

先决条件

  • C/C++
  • Windows 用户界面编程

说明

使用流

下面的代码示例展示了如何将 .rtf 文件读入 Rich Edit 控件。 文件句柄通过 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)