需要帮助来设置 RichEdit

Need help to setup RichEdit

我正在尝试在 RichEdit 中设置以下文本(我猜是 v2.0,因为我使用“Riched20.dll”库):

{\rtf1Привет!\par{ \i This } is super {\b text}.\par}

第一个问题是错误的符号而不是非拉丁文本 Привет,第二个问题是粗体文本部分 {\b text},呈现为非粗体。这是屏幕截图:

Visual Studio 设置为“使用 Unicode 字符集”(我正在开发的应用程序已经以这种方式设置,但我仍然不太了解 Win 编码的工作方式)。我使用普通字符(例如非宽字符)std::string,因为宽字符 类 不适用于我的代码 - 那是我以前的 .

这是代码片段:

    DWORD CALLBACK EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
    {
        std::stringstream* rtf = (std::stringstream*)dwCookie;
        *pcb                   = rtf->readsome((char*)pbBuff, cb);
        return 0;
    }

    // ...
    auto hwndEdit = CreateRichEdit(hWnd, 100, 100, 300, 300, hInstance);
    std::stringstream rtf("{\rtf1Привет!\par{ \i This } is super {\b text}.\par}");

    EDITSTREAM es  = { 0 };
    es.dwCookie    = (DWORD_PTR)&rtf;
    es.pfnCallback = &EditStreamInCallback;

    SendMessage(hwndEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);

更新: 最终目标是:从 JSON 中获取一些 RTF 字符串(可能由 unicode(?) 文本、链接等组成) :

{
    "text": "{\rtf1Привет!\par{ \i This } is super {\b text}.\par}"
}

,显示它,处理超链接的点击,几乎肯定会修改特定符号(特定符号是自定义符号,用我们自己修改的 .ttf 字体替换原始符号)。我还没有阅读 RTF 文档,使用给定的字符串只是为了检查 RichEdit 控件和相应的 winapi 是如何工作的。

我想最终的 RTF 文本将在 RTF 编辑器中形成。几乎可以肯定,写字板。

根据 RTF 格式规范转换您的文本:

std::string rtf("{\rtf1\deff1{\fonttbl{\f0\fcharset0 Times New Roman;}{\f1\fcharset0 Segoe UI;}}{\lang1033{\f1{\ltrch\u1055?\u1088?\u1080?\u1074?\u1077?\u1090?!}\li0\ri0\sa0\sb0\fi0\ql\par}{\f1{\i\ltrch This }{\ltrch is super }{\b\ltrch text}{\ltrch .}\li0\ri0\sa0\sb0\fi0\ql\par}}}");

std::stringstream ss(rtf);
EDITSTREAM es = { 0 };
es.dwCookie = (DWORD_PTR)&ss;
es.pfnCallback = &EditStreamInCallback;
SendMessage(richedit, EM_STREAMIN, SF_RTF, (LPARAM)&es);

rtf 字符串生成以下文本:

以上rtf字符串中使用的主要控制字列表(根据富文本格式 (RTF) 版本 1.5 规范):

  • \rtf1
    RTF文档规范版本为1.

  • \deffN
    \deff 控制字指定了默认字体编号。

  • \fonttbl
    \fonttbl 控制字引入字体 table 组。

  • \lang1033
    将语言应用于字符。 N是对应一种语言的数字。

在项目设置中,您可以将 Character Set 定义为 Use Unicode characterUse Multi-Byte CharacterNot Set,对于这种情况无关紧要。