[英]Need help to setup RichEdit
我正在嘗試在 RichEdit(我猜是 v2.0,因為我使用“Riched20.dll”庫)中設置以下文本:
{\\rtf1Привет!\\par{ \\i This } 超級{\\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。
\\定義N
\\deff 控制字指定了默認字體編號。
\\fonttbl
\\fonttbl 控制字引入了字體表組。
\\lang1033
將語言應用於字符。 N是對應於一種語言的數字。
在項目設置中,您可以將Character Set
定義為Use Unicode character
、 Use Multi-Byte Character
或Not Set
,在這種情況下無關緊要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.