为什么CRichEditControl隐藏了单词周围的边框

时间:2017-10-12 17:22:59

标签: c++ mfc richedit cricheditctrl

我正在使用CRichEditCtrl(RichEdit20A)来显示rtf-text:

m_reText.SetWindowText(strRtfText);

问题是控件不会在rtf-text中显示单词边框,如下所示:

{\rtf1
\box\brdrdot
Hello World
}

我也尝试了RichEdit5.0,因为它提出了here,但结果是一样的,没有显示边框。但是,如果我将文本保存在.rtf文件中并在MSWord或Libre / OpenOffice编辑器中打开它,则文本周围的虚线边框会正确显示:

enter image description here

为什么CRichEditControl会隐藏我的边框?请帮助,我将不胜感激任何建议。

1 个答案:

答案 0 :(得分: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的拼写检查中获取rtf字符串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);