需要帮助来设置 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 character
、Use Multi-Byte Character
或 Not Set
,对于这种情况无关紧要。
我正在尝试在 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 character
、Use Multi-Byte Character
或 Not Set
,对于这种情况无关紧要。