您可以通过丰富的编辑显示表格和边框。下面会显示一个方块,固体边界:
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\
}";
参见link
注意,CRichEditCtrl::SetWindowText
就叫::SetWindowText
WinAPI的,它将设置字符串为纯文本。
使用CRichEdit::StreamIn
设置原始rtf字符串。在你的情况下,你可能使用自己的类,它会覆盖CRichEditCtrl::SetWindowText
并运行必要的流。
请尝试以下解决Word中的拼写检查RichEdit中获得RTF格式字符串:
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);
'm_reText.SetWindowText(strRtfText);'将无法工作。它将只显示文本,如同“{\ rtf1 \ box \ ...”。您已通过编辑流加载rtf文本。它仍然不会显示像这些边界的一些功能。 Microsoft Word使用不同的引擎,这就是为什么它可以显示它。我想在RTF中你可以显示表格,我不记得了。您可能会考虑使用HTML控件,但这可能会遇到其他问题。 –
非常感谢您的回答。对我来说,通过SetWindowText加载工作正常,控件显示的格式与写字板一样多,包括表格。但是豁免那些边界( – vtrz
“Microsoft Word使用不同的引擎” 如果是这样,它为什么加载RichEdit20W,如MSWord 2010中的spy ++ for拼写检查对话框所示(此框*显示*文本周围的边框)? – vtrz