How to get text with RTF format from Rich Edit Win API?

前端 未结 2 572
无人共我
无人共我 2021-01-03 08:12

(Sorry for my crazy English) I want to get all the text in Rich Edit with RTF format, not plain text to a variable. I tried SendMessage() with EM_STREAMOUT to write directly

2条回答
  •  说谎
    说谎 (楼主)
    2021-01-03 08:16

    You can pass your variable to the EM_STREAMOUT callback so it can be updated as needed, eg:

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

    Update: to load RTF data into the RichEdit control, use EM_STREAMIN, eg:

    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);
    

提交回复
热议问题