4

(私のクレイジーな英語で申し訳ありません)変数へのプレーンテキストではなく、RTF形式のリッチエディットですべてのテキストを取得したいと思います。EM_STREAMOUTを指定してSendMessage()を実行し、リッチエディットをファイルに直接書き込もうとしましたが、コンテンツを特定の変数(LPWSTRなど)に保存できません。MFCではなくWinAPIのみを覚えておいてください。助けてくれてありがとう!

4

2 に答える 2

6

変数を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;
}

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...

更新: RTFデータをRichEditコントロールにロードするには、次を使用しますEM_STREAMIN。例:

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);
于 2013-03-27T19:13:19.397 に答える
3

メッセージを使用すること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
    }
}
于 2013-03-27T11:17:17.423 に答える