天天看點

CRichEditCtrl加載 rtf 檔案和字元串的方法

CRichEditCtrl類沒有直接指派 rtf 的方法,需要通過回調函數的方式加載。方法如下(該方法也可用于加載文本格式的檔案或字元串):

  • 函數聲明:

    static DWORD CALLBACK EditStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);

  • 加載檔案的方式

    EDITSTREAM es;

    CFile file(_T("E://a.rtf"), CFile::modeRead);

    es.dwError = 0;

    es.pfnCallback = EditStreamCallback;

    es.dwCookie = (DWORD) &file;

    m_wndRichEdit.StreamIn(SF_RTF, es);

    file.Close();

    DWORD CALLBACK CPrintDlg::EditStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)

    {

    CFile* pFile = (CFile*)dwCookie;

    *pcb = pFile->Read(pbBuff, cb);

    return 0;

    }

  • 加載字元串(rtf或純文字)
    1. 通過臨時檔案

      void CPrintDlg::PrintTickets()

      {

      EDITSTREAM es;

      char* pBuffer = NULL;

      long lBufferSize;

      lBufferSize = WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, m_sRtf, -1, NULL, 0, NULL, NULL);

      pBuffer = new char[lBufferSize + 1];

      WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, m_sRtf, -1, pBuffer, lBufferSize + 1, NULL, NULL);

      CFile file(_T("E://a.rtf"), CFile::modeCreate | CFile::modeWrite);

      file.Write(pBuffer, lBufferSize);

      file.Close();

      file.Open(_T("E://a.rtf"), CFile::modeRead);

      es.dwError = 0;

      es.pfnCallback = EditStreamCallback;

      es.dwCookie = (DWORD) &file;

      m_wndRichEdit.StreamIn(SF_RTF, es);

      file.Close();

      delete[] pBuffer;

      }

      DWORD CALLBACK CPrintDlg::EditStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)

      {

      CFile* pFile = (CFile*)dwCookie;

      *pcb = pFile->Read(pbBuff, cb);

      return 0;

      }

    2. 直接加載字元串

      void CPrintDlg::PrintTickets()

      {

      EDITSTREAM es;

      char* pBuffer = NULL;

      char* pTmp2;

      char** pTmp;

      long lBufferSize;

      lBufferSize = WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, m_sRtf, -1, NULL, 0, NULL, NULL);

      pBuffer = new char[lBufferSize + 1];

      WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, m_sRtf, -1, pBuffer, lBufferSize + 1, NULL, NULL);

      pTmp2 = pBuffer;

      pTmp = &pTmp2;

      es.dwError = 0;

      es.pfnCallback = EditStreamCallback;

      es.dwCookie = (DWORD)pTmp;

      m_wndRichEdit.StreamIn(SF_RTF, es);

      pTmp = NULL;

      delete[] pBuffer;

      }

      DWORD CALLBACK CPrintDlg::EditStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)

      {

      char** pBuffer = (char**)dwCookie;

      long lBufferSize = strlen(*pBuffer);

      if (lBufferSize < cb)

      {

      *pcb = lBufferSize;

      memcpy(pbBuff, *pBuffer, lBufferSize);

      }

      else

      {

      *pcb = cb;

      memcpy(pbBuff, *pBuffer, cb);

      *pBuffer += cb;

      }

      return 0;

      }