コントロールを作成し、CRichEditCtrl
それにRTFをロードしようとしています。テキストは正常に読み込まれるように見えますが、すべてのフォーマットが失われ、基本的にプレーンテキストになります。
明確にするために、いくつかのサンプルコードで十分だと思います。
class MyWindow : public CWnd {
void Setup();
static DWORD CALLBACK StreamInCallback_(
DWORD_PTR dwCookie, LPBYTE pbBuff,
LONG cb, LONG *pcb);
...
CRichEditCtrl content_;
};
void MyWindow::Setup() {
RECT text_rect;
GetClientRect(&text_rect);
text_rect.left += 8;
text_rect.right -= 16;
text_rect.top += 8;
text_rect.bottom -= 36;
content_.Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE,
text_rect, this, 1001);
content_.SetTextMode(TM_RICHTEXT);
CString text = L"{\\rtf1\\par Simple \\b example \\b0}";
EDITSTREAM es;
es.dwCookie = reinterpret_cast<DWORD_PTR>(&text);
es.pfnCallback = StreamInCallback_;
int n = content_.StreamIn(SF_RTF, es);
}
DWORD CALLBACK MyWindow::StreamInCallback_(DWORD_PTR dwCookie, LPBYTE pbBuff,
LONG cb, LONG *pcb) {
CString *pText = reinterpret_cast<CString *>(dwCookie);
if (cb > pText->GetLength()) {
cb = pText->GetLength();
}
// TODO: this will only work for US-ASCII
for (int i = 0; i < cb; i++) {
*(pbBuff + i) = (BYTE) pText->GetAt(i);
}
*pcb = cb;
*pText = pText->Mid(cb);
return 0;
}
以下のスクリーンショットで、これがどのように見えるかの例を見ることができます。
ご覧のとおり、テキストはOKですが、「例」という単語は太字にする必要があります。ワードパッドによって保存されたものを直接使用して、さまざまなRTFを試しましたが、それでもテキストはプレーンテキストとしてのみ表示され、すべての書式設定が失われます。どの関数呼び出しからもエラーは返されません。