如何使Richedit实现图文混排?

halflife 2000-06-16 04:46:00
bcb3.0的TRichedit控件会把RTF文件的图片过滤掉,请问各位高手如何实现图文混排?
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
olo 2000-06-29
  • 打赏
  • 举报
回复
MS的richtx32.ocx就可以。VB带的。
halflife 2000-06-28
  • 打赏
  • 举报
回复
嵌入OLE也只是把bmp插入而已,远达不到像Word这样的排版效果,现在我准备把所有的图文都作为图形来处理,多谢各位尤其是xielm的帮助.
xielm 2000-06-28
  • 打赏
  • 举报
回复
就是通过嵌入OLE实现的,看看下面的代码吧
void CRTFBitmapDlg::InsertPlotBitmap()
{
USES_CONVERSION;
SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &m_lpLockBytes);
if (sc != S_OK)
AfxThrowOleException(sc);
ASSERT(m_lpLockBytes != NULL);

sc = ::StgCreateDocfileOnILockBytes(m_lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
if (sc != S_OK)
{
VERIFY(m_lpLockBytes->Release() == 0);
m_lpLockBytes = NULL;
AfxThrowOleException(sc);
}

CString szFileName( _T("ja.bmp") );

// attempt to create the object
sc = ::OleCreateFromFile(CLSID_NULL, T2COLE(szFileName),
IID_IUnknown, OLERENDER_DRAW, NULL, NULL,
m_lpStorage, (void **)&m_lpObject);
if ( sc != S_OK )
{
TCHAR * lpMsgBuf;
::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM, NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL );
CString msg( lpMsgBuf );
msg += _T("\n\n\nThe following file, created in\n"
"Simulation->Plot, may be missing due\n"
"to not doing a File->Save Workspace:\n\n" );
msg += szFileName;
AfxMessageBox( msg, MB_OK );
::LocalFree( lpMsgBuf );
return;
}

// m_lpObject is currently an IUnknown, convert to IOleObject
if (m_lpObject != NULL)
{
LPUNKNOWN lpUnk = m_lpObject;
m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
lpUnk->Release();
if (m_lpObject == NULL)
AfxThrowOleException(E_OUTOFMEMORY);
}

// cache the IViewObject interface
m_lpViewObject = QUERYINTERFACE(m_lpObject, IViewObject2);
if (m_lpViewObject == NULL)
return;

// setup for advises; we assume that OLE cleans them up properly
LPADVISESINK lpAdviseSink =
(LPADVISESINK)GetInterface(&IID_IAdviseSink);

// set up view advise
VERIFY(m_lpViewObject->SetAdvise(DVASPECT_CONTENT, 0, lpAdviseSink)
== S_OK);

// the server shows these in its user-interface
// (as document title and in File Exit menu)
m_lpObject->SetHostNames(T2COLE(AfxGetAppName()),
T2COLE(_T("Test")));

// all items are "contained" -- this makes our reference to this object
// weak -- which is needed for links to embedding silent update.
OleSetContainedObject(m_lpObject, TRUE);

CHARRANGE cr;
m_reportCtrl.GetSel( cr );
cr.cpMin = cr.cpMax -1;
m_reportCtrl.SetSel( cr );

REOBJECT reo;
memset( &reo, 0, sizeof( reo ) );
reo.cbStruct = sizeof( reo );
CLSID classID;
if ( m_lpObject->GetUserClassID( &classID ) != S_OK)
classID = CLSID_NULL;
reo.clsid = classID;
reo.cp = REO_CP_SELECTION;
reo.poleobj = m_lpObject;
reo.pstg = m_lpStorage;
LPOLECLIENTSITE lpClientSite;
m_reportCtrl.GetIRichEditOle()->GetClientSite( &lpClientSite );
reo.polesite = lpClientSite;
SIZEL sizel;
sizel.cx = sizel.cy = 0; // let richedit determine initial size
reo.sizel = sizel;
reo.dvaspect = DVASPECT_CONTENT;
reo.dwFlags = REO_RESIZABLE;
reo.dwUser = 0;
HRESULT hr = m_reportCtrl.GetIRichEditOle()->InsertObject( &reo );
}
SCUM 2000-06-27
  • 打赏
  • 举报
回复
看看 olepro32.dll
另外可找一些现成的控件。我曾有一个,效果接近 word,很不错。
可惜是在一张已丢失的光盘上找的。
SCUM 2000-06-27
  • 打赏
  • 举报
回复
看看 olepro32.dll
alexela 2000-06-21
  • 打赏
  • 举报
回复
用OLEConTainer组件,很好实现
xielm 2000-06-20
  • 打赏
  • 举报
回复
我覺得用欠入OLE Object的方法可以實現,可惜我也不會調用。
forqzy 2000-06-18
  • 打赏
  • 举报
回复
Borland 的 richedit 都不能够显示图形,如你一定要用可以安装richedit.ocx可以显示不过效果不太好

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧