2017-10-12 70 views
0

我使用CRichEditCtrl(RichEdit20A)来显示RTF文本:为什么身边的话CRichEditControl隐藏边框

m_reText.SetWindowText(strRtfText); 

的问题是控制不显示围绕在这样的RTF文本字的边界:

{\rtf1 
\box\brdrdot 
Hello World 
} 

我也试过RichEdit5.0的方式,因为它提出here,但结果是不显示的一样,边境。但是,如果我保存文本在.rtf文件和的MSWord或自由报/ OpenOffice的编辑器打开它,文本周围虚线边框正确显示:

enter image description here

为什么CRichEditControl藏在我的情况下,边界?请帮助,我将不胜感激任何建议。

+1

'm_reText.SetWindowText(strRtfText);'将无法工作。它将只显示文本,如同“{\ rtf1 \ box \ ...”。您已通过编辑流加载rtf文本。它仍然不会显示像这些边界的一些功能。 Microsoft Word使用不同的引擎,这就是为什么它可以显示它。我想在RTF中你可以显示表格,我不记得了。您可能会考虑使用HTML控件,但这可能会遇到其他问题。 –

+0

非常感谢您的回答。对我来说,通过SetWindowText加载工作正常,控件显示的格式与写字板一样多,包括表格。但是豁免那些边界( – vtrz

+0

“Microsoft Word使用不同的引擎” 如果是这样,它为什么加载RichEdit20W,如MSWord 2010中的spy ++ for拼写检查对话框所示(此框*显示*文本周围的边框)? – vtrz

回答

1

您可以通过丰富的编辑显示表格和边框。下面会显示一个方块,固体边界:

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

巴尔马克,谢谢你的详细回答。 “你可以用丰富的编辑来显示表格和边框。” 是的,我知道我可以,但是我不想用我自己的增加来污染文本 让我澄清一下,我正在写一个办公室插件,我想要的是从Word中取出大量文本,通过RichEdit控件将其呈现给用户,并且在用户进行一些修改后,将其带回Word中。 MSWord 2010。可惜的是,并非所有的格式都能以这种方式安全地传输,正如我从你的答案中所理解的那样。 – vtrz

+0

我不知道你在描述什么。也许您可以在显示Word拼写检查的问题中发布屏幕截图。 –

+0

我已将截图添加到问题中。 – vtrz