Windows RichEdit控件的最新版本是4.1。然而,MFC框架中仍旧使用老版本的控件。例如MFC6.0使用的是RichEdit控件版本1,相当落后,甚至新的Visual Studio 2005-2010中附带的MFC也仅适用RichEdit控件 版本2或版本3。
如何解决这个问题?
为了在MFC类CRichEditView中使用RichEdit控件4.1 ,并享受其新的功能,我们可以做以下步骤:
第1步
在MFC应用程序类(从CWinApp派生)加载的MSFTEDIT.DLL的库模块,其中包含RichEdit控件4.1。
BOOL CRichEdit41App::InitInstance()
{
// Load RichEdit 4.1 library
HMODULE hRE41Module = ::LoadLibrary(_T("MSFTEDIT.DLL"));
if(NULL == hRE41Module)
{
AfxMessageBox(_T("RichEdit 4.1 library could not be loaded"));
return FALSE;
}
// ...
}
第2步
在MFC视图类(从CRichEditView的派生)的构造函数中,为4.1 RichEdit设置窗口类名为“RICHEDIT50W”。
// Note: MSFTEDIT_CLASS is not defined in MFC6.0 and older
#ifndef MSFTEDIT_CLASS
#define MSFTEDIT_CLASS L"RICHEDIT50W";
#endif
CRichEdit41View::CRichEdit41View()
{
m_strClass = MSFTEDIT_CLASS;
}
第3步
在WM_DESTROY消息处理函数中,删除基类的方法调用。
注:这一步在MFC 6.0及更老版本中是必须的。
void CRichEdit41View::OnDestroy()
{
// CRichEditView::OnDestroy(); //
COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
if (pActiveItem != NULL && pActiveItem->GetActiveView() == this)
{
pActiveItem->Deactivate();
ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);
}
CRichEditView::OnDestroy(); //
}
源代码下载