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或純文字)
-
通過臨時檔案
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;
}
-
直接加載字元串
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;
}
-