среда, 17 сентября 2008 г.

Получение из RTF простого текста

Это функция, которая получает из RTF строки обычный текст. Для этого я использую контрол CRichEditControl50W унаследованный от CRichEditCtrl (этот класс я отрыл в инете). Как это работает имеем на входе sContent - строка RTF и rchEdit - указатель на контрол. Запихиваем строку в контрол и получаем с него текст. В моём случае мне надо було получать текст из другого контрола и там находить. Поэтому пришлось добавлять в диалог скрытый rchEdit контрол и с ним уже работать.

Без участия контрола я так и не смог найти в инете решение. Были функциии, которые заменяли RTF текст на Text посредством замены RTF символов, но эти функции настолько не предсказуемо работали, что я просто отказался от их использования.


CString GetTextFromRTF(CRichEditControl50W *rchEdit,CString sContent)
{
long res;
// read the text in
EDITSTREAM es;
es.dwError = 0;
es.dwCookie = (DWORD) &sContent;
es.pfnCallback = CBStreamIn;

rchEdit->ModifyStyle(0,SEL_TEXT SEL_MULTICHAR SEL_MULTIOBJECT);

rchEdit->LimitText50W(-1);
// do it.
rchEdit->SetTextTo50WControl(sContent,ST_SELECTION, 1200);

rchEdit->SetSel50W(0, -1);

CHARRANGE cr;
cr.cpMin = 0;
cr.cpMax = -1;
// select all text in richedit ctrl
SendMessage(rchEdit->m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);

// get number of chars in selected text
SendMessage(rchEdit->m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);

int numchars = (cr.cpMax-cr.cpMin+2)*2; //allow for trailing null too

//create a buffer for all those chars
wchar_t* lpsz = (wchar_t*)_alloca(numchars);
lpsz[0] = NULL;


SendMessage(rchEdit->m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
CString sRes = CString(lpsz);

return sRes;
}

Комментариев нет: