Office的富文档格式显示的内容很丰富,但是在自己的软件中把Word格式的文档显示出来就比较难了。目前,我知道有2种方法:一种是把Word文档转为HTML网页文件,然后通过浏览器控件来显示;另外一个办法是转为RTF格式(可能源Word文档的某些格式内容会丢失),通过RichEditCtrl来显示。这篇文章就给大家展示第二种方式的实现方法,我在资源里提供了一个例子:
http://download.youkuaiyun.com/download/toshiba689/10267986
首先,我们需要实现一个基于CRichEditCtrl的派生类:COleRichEditCtrl,头文件在OleRichEditCtrl.h,这个类主要实现了读取RTF资源的接口,详细实现大家看例子中的代码,这里不作介绍。下面讲解怎么基于这个类在一个MFC实现的窗口中滚动显示RTF文档:
1. 在你窗口类里包含OleRichEditCtrl.h,定义一个类成员变量:
COleRichEditCtrl * m_RichView;
还有再定义两个变量:
int g_nTotalLines;
int g_nCurrentLine;
2. 在你窗口初始化的时候创建RichEditCtrl,代码如下:
m_RichView = new COleRichEditCtrl();
CRect rect;
GetClientRect(&rect);
BOOL bRet = m_RichView->Create(WS_CHILD|WS_VISIBLE/*|WS_VSCROLL*/|ES_WANTRETURN|ES_MULTILINE,
rect,this, IDC_RICHEDIT_VIEW);
3. 打开RTF文档,把文档内容加载到RichEdit控件。
m_RichView->Clear();
g_nTotalLines = 0;
g_nCurrentLine = 0;
m_RichView->StreamInFromResource( m_strRTFFilePath );
g_nTotalLines = m_RichView->GetLineCount();
4. 实现定时器函数,处理如下:
void CMainFrame::OnTimer(UINT nIDEvent)
{
static int n = 0;
int nFirstVisible = 0;
nFirstVisible = m_RichView->GetFirstVisibleLine();
if(g_nCurrentLine < g_nTotalLines)
{
m_RichView->LineScroll(1);
if(g_nCurrentLine == nFirstVisible )
{
if(n < 2)
{
n++;
}
else
{
m_RichView->LineScroll(-g_nTotalLines);
g_nCurrentLine = 0;
n = 0;
//KillTimer(1);
}
}
else
{
g_nCurrentLine = nFirstVisible;
}
}
else
{
m_RichView->LineScroll(-g_nTotalLines);
g_nCurrentLine = 0;
//KillTimer(1);
}
CFrameWnd::OnTimer(nIDEvent);
}