需要帮助设置 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
字符串产生以下文本:
上面rtf
string中使用的主要控制字列表(根据富文本格式(RTF)1.5版规范):
\rtf1 RTF 文档规范版本为 1。
\deffN \deff 控制字指定了默认字体号。
\fonttbl \fonttbl 控制字引入字体表组。
\lang1033 将语言应用于字符。 N 是对应于语言的数字。
在项目设置中,您可以将Character Set
定义为Use Unicode character
、Use Multi-Byte Character
或Not Set
,对于这种情况无关紧要。
【讨论】:
以上是关于需要帮助设置 RichEdit的主要内容,如果未能解决你的问题,请参考以下文章