Winapi 如何从Rich Edit Win API获取RTF格式的文本?

Winapi 如何从Rich Edit Win API获取RTF格式的文本?,winapi,rtf,richedit,Winapi,Rtf,Richedit,对不起,我的疯狂英语 我想获得RTF格式的富编辑中的所有文本,而不是将纯文本转换为变量。我尝试使用EM_STREAMOUT发送消息,直接将富编辑写入文件,但无法将内容保存到特定变量,例如LPWSTR。请记住,只赢API,不赢MFC。谢谢你的帮助 使用EM_STREAMOUT消息就是答案 下面是我可以构造的最简单的示例。这将把富编辑控件的内容保存到文件中 DWORD CALLBACK EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff,

对不起,我的疯狂英语 我想获得RTF格式的富编辑中的所有文本,而不是将纯文本转换为变量。我尝试使用EM_STREAMOUT发送消息,直接将富编辑写入文件,但无法将内容保存到特定变量,例如LPWSTR。请记住,只赢API,不赢MFC。谢谢你的帮助

使用EM_STREAMOUT消息就是答案

下面是我可以构造的最简单的示例。这将把富编辑控件的内容保存到文件中

DWORD CALLBACK EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    HANDLE hFile = (HANDLE)dwCookie;
    DWORD NumberOfBytesWritten;
    if (!WriteFile(hFile, pbBuff, cb, &NumberOfBytesWritten, NULL))
    {
        //handle errors
        return 1;
        // or perhaps return GetLastError();
    }
    *pcb = NumberOfBytesWritten;
    return 0;
}

void SaveRichTextToFile(HWND hWnd, LPCWSTR filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        //handle errors
    }
    EDITSTREAM es = { 0 };
    es.dwCookie = (DWORD_PTR) hFile;
    es.pfnCallback = EditStreamOutCallback; 
    SendMessage(hWnd, EM_STREAMOUT, SF_RTF, (LPARAM)&es);
    CloseHandle(hFile);
    if (es.dwError != 0)
    {
        //handle errors
    }
}

您可以将变量传递给EM_STREAMOUT回调,以便根据需要进行更新,例如:

DWORD CALLBACK EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    std::stringstream *rtf = (std::stringstream*) dwCookie;
    rtf->write((char*)pbBuff, cb);
    *pcb = cb;
    return 0;
}

更新:要将RTF数据加载到RichEdit控件中,请使用EM_STREAMIN,例如:


谢谢雷米的支持!嗨@Remy Lebeau!那么,关于将rtf插入到Rich Edit中?+1做得不错。使用std::stringstream,所有这些输入和输出难道不容易吗?谢谢@Remy!我将“rtf”变量声明为全局变量。从RichEdit读取后,现在使用“rtf”加载到RichEdit中,我使用断点检查“pbBuff”的值:{\rtf1\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fswiss\fprq2\fcharset0 System;}}}\viewkind4\uc1\pard\f0\fs20,{rtf是:{\rtf1\ansi\ansicpg1252\deff0\deflang1033}{\f0\fnil\fcharset0 Tahoma;}{\f1\fswiss\fprq2\fcharset0 System;}}}\viewkind4\uc1\pard\f0\fs20 Hello World\b\f1\fs20\par}为什么?回调可能会被多次调用以流式传输整个RTF。RTF越大,调用回调的次数就越多。谢谢David!但我需要存储一个变量。无论如何,再次感谢!根本不清楚您想要什么。我以为您根本不知道如何使用EM_STREAMOUT。我还以为您是在用C.Y编写代码你说得对,大卫:D。我是WinAPI的新手。顺便问一下,你能帮我编辑上面雷米的代码吗?如何插入[std::string rtf]富编辑中的值?我知道我需要将“rtf”分配给“pbBuff”,对吗?但我不知道如何分配?我正在使用Visual Studio 2008编写Win32应用程序。谢谢!我可以这样做。但雷米也可以。是的,我会先自己做,然后等待雷米:D
std::stringstream rtf;

EDITSTREAM es = {0};
es.dwCookie = (DWORD_PTR) &rtf;
es.pfnCallback = &EditStreamOutCallback; 
SendMessage(hRichEditWnd, EM_STREAMOUT, SF_RTF, (LPARAM)&es);

// use rtf.str() as needed...
DWORD CALLBACK EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    std::stringstream *rtf = (std::stringstream*) dwCookie;
    *pcb = rtf->readsome((char*)pbBuff, cb);
    return 0;
}
std::stringstream rtf("...");

EDITSTREAM es = {0};
es.dwCookie = (DWORD_PTR) &rtf;
es.pfnCallback = &EditStreamInCallback; 
SendMessage(hRichEditWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);