1

コントロールを作成し、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を試しましたが、それでもテキストはプレーンテキストとしてのみ表示され、すべての書式設定が失われます。どの関数呼び出しからもエラーは返されません。

4

2 に答える 2

1

確かに私には正しいように見えます。SetTextMode(TM_RICHTEXT)ただし、 RTF コンテンツを扱う場合は使用したことがありません。その呼び出しを削除してみてください。

また、StreamInCallbackエラーによって奇妙なテキストの問題が発生する可能性があります。最初から正しい方法で行うことをお勧めします。

DWORD CALLBACK CBStreamIn(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    CString *pstr = (CString*)dwCookie;

    if (pstr->GetLength() < cb)
    {
        *pcb = pstr->GetLength();
        memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
        pstr->Empty();
    }
    else
    {
        *pcb = cb;
        memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
        *pstr = pstr->Right(pstr->GetLength() - cb);
    }

    return 0;
}
于 2012-09-17T09:09:28.287 に答える
0

RTF でのヘッダーの設定が機能するかどうか試してください。以下のリンクをチェック

http://www.biblioscape.com/rtf15_spec.htm

これが richeditctrl で機能するかどうかを確認してください。

{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}\\par Simple \\b example \\b0}
于 2012-09-18T07:22:16.740 に答える