需要帮助设置 RichEdit

Posted

技术标签:

【中文标题】需要帮助设置 RichEdit【英文标题】:Need help to setup RichEdit 【发布时间】:2021-12-13 20:14:14 【问题描述】:

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

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

第一个问题是符号错误而不是非拉丁文本Привет,第二个问题是粗体文本部分\\b text,它被渲染为非粗体。这是截图:

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

这里是sn-p的代码:

    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 格式并不完全正确,它需要正确的 Unicode 字体。您只需要 RTF 控件的初始化文本吗?这是否会被编辑/保存,它是否必须与写字板兼容? ...我还更新了以前的答案。 RTF 是一种严格的 ASCII 格式,您不能在其中存储 未编码 Unicode 字符。您需要使用适当的 RTF 转义码来处理 Unicode 字符(\ansicpg\u\uc 等)。见Unicode RTF。 @Jackdaw 这只会影响 RichEdit 是否可以处理一般的 Unicode 文本。它不会影响 Unicode 在实际 RTF 本身中的处理方式。 【参考方案1】:

根据 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 字符串产生以下文本:

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

\rtf1 RTF 文档规范版本为 1。

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

\fonttbl \fonttbl 控制字引入字体表组。

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

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

【讨论】:

以上是关于需要帮助设置 RichEdit的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助将具有透明背景的图像设置为剪贴板

需要帮助设置“工作场所”

需要帮助设置 RichEdit

需要帮助使用 JavaScript 设置最小字符数

需要帮助在 tomcat 上设置 CORS

需要帮助从 NSDictionary 设置单元格的 TextLabel