首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRichEditCtrl::StreamIn丢失格式

CRichEditCtrl::StreamIn丢失格式
EN

Stack Overflow用户
提问于 2012-09-13 12:40:18
回答 2查看 1.6K关注 0票数 1

我正在创建一个CRichEditCtrl控件,并试图将一些RTF加载到其中。文本看起来加载得很好,但它丢失了所有格式,本质上变成了纯文本。

我认为一些示例代码应该足以说明这一点:

代码语言:javascript
复制
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,但单词"example“应该是粗体的。我尝试了很多不同的RTF,甚至直接使用写字板保存的内容,但它仍然只将文本显示为纯文本,并且所有格式都会丢失。任何函数调用也不会返回任何错误。

EN

回答 2

Stack Overflow用户

发布于 2012-09-17 17:09:28

在我看来是正确的。不过,在处理RTF内容时,我从未使用过SetTextMode(TM_RICHTEXT)。试着去掉那个电话。

此外,错误的StreamInCallback可能会产生奇怪的文本问题。我建议你从一开始就以正确的方式来做:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-09-18 15:22:17

尝试在RTF中设置报头是否有效。检查下面的链接

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

检查这是否能在你的richeditctrl中工作。

代码语言:javascript
复制
{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}\\par Simple \\b example \\b0}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12399510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档