я использую CRichEditCtrl (RichEdit20A) для отображения rtf-текста:
m_reText.SetWindowText(strRtfText);
Проблема в том, что элемент управления не отображает рамку вокруг слов в rtf-тексте так:
{\rtf1
\box\brdrdot
Hello World
}
Я также попробовал RichEdit5.0 таким образом, как это было предложено Вот, но результат тот же, граница не отображается. Однако если я сохраню текст в файле .rtf и открою его в редакторе MSWord или Libre / OpenOffice, пунктирная рамка вокруг текста будет отображаться правильно:
Почему CRichEditControl скрывает границу в моем случае? Пожалуйста, помогите, я был бы признателен за любые предложения.
Вы можете отображать таблицы и границы с богатым редактированием. Ниже будет показано поле со сплошными границами:
str = L"{\\rtf1\
\\trowd\\trgaph72 \
\\clbrdrt\\brdrdot\\clbrdrl\\brdrdot\\clbrdrb\\brdrdot\\clbrdrr\\brdrdot \
\\cellx3000 TEXT\\intbl\\cell \
\\row\\pard\\par\
}";
Если вы запустите это в Microsoft Word, то оно будет показывать пунктирные линии, как это должно быть. RichEdit не обрабатывает пунктирные границы, как это должно быть, или, возможно, он ожидает другой формат. Если вы сохраните файл из Word, он все еще не показывает пунктирные линии.
Если вам не нужны пунктирные линии, используйте следующие простые примеры, чтобы показать блоки в RichEdit:
CString str;
str = L"{\\rtf1\
\\trowd\\trgaph72 \
\\cellx3000 TEXT\\intbl\\cell \
\\row\\pard\\par\
}";
str = L"\
{\\rtf1\\ansi\\deff0\
\\trowd\
\\cellx1000\
\\cellx2000\
\\cellx3000\
\\ TEXT1\\cell\
\\ TEXT2\\cell\
\\ TEXT3\\cell\
\\row\
}";
Смотрите также ссылка на сайт
Заметка, CRichEditCtrl::SetWindowText
просто позвонит ::SetWindowText
WinAPI, он установит строку в виде простого текста.
использование CRichEdit::StreamIn
установить необработанную строку RTF. В вашем случае вы, вероятно, используете свой собственный класс, который переопределяет CRichEditCtrl::SetWindowText
и запускает необходимую потоковую передачу.
Попробуйте следующее, чтобы получить строку rtf из проверки орфографии Word RichEdit:
DWORD __stdcall rtfstreamget(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CStringA text;
text.GetBufferSetLength(cb);
CStringA *ptr = (CStringA*)dwCookie;
for(int i = 0; i < cb; i++)
text.SetAt(i, *(pbBuff + i));
*ptr += text;
*pcb = text.GetLength();
text.ReleaseBuffer();
return 0;
}
bool GetRTF(hWnd, CString &sW)
{
CStringA sA;
EDITSTREAM es{ 0 };
es.dwCookie = (DWORD_PTR)&sA;
es.pfnCallback = rtfstreamget;
edit.StreamOut((CP_UTF8 << 16) | SF_USECODEPAGE | SF_RTF, es);
SendMessage(hWnd, EM_STREAMOUT,
(CP_UTF8 << 16) | SF_USECODEPAGE | SF_RTF, (LPARAM)&es);
sW = CA2W(sA, CP_UTF8);
return es.dwError == 0;
}
CStringW s;
GetRTF(msword_spellcheck_hwindow, str);
Других решений пока нет …