在之前的文章《RichEdit 各个版本介绍》中,写到RichEdit已经到达6.0版本了,而我们经常编程使用的却还是2.0,在vc6.0中甚至还使用1.0版本,更高的版本修复了很多的bug,还提供了许多新特性,我们没有理由不去使用它们。在此介绍,在VS2008SP1中如何加载RichEdit4.1版本,甚至更高版本的也可以类似加载。
原理:
1.启动VS2008,新建一个基于CRichEditView的多文档视图Unicode工程,名称取为:CTest_Richedit;
2.查看源代码,CTest_RicheditView派生自CRichEditView,右键CRichEditView“转到声明”,发现CRichEditView派生自CCtrlView,继续查看CRichEditView的构造函数(在文件X:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\viewrich.cpp中),如下所示:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
  CRichEditView::CRichEditView() : CCtrlView(RICHEDIT_CLASS,   
    AFX_WS_DEFAULT_VIEW | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL |   
    ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_SAVESEL |    
    ES_SELECTIONBAR)   
{   
    m_bSyncCharFormat = m_bSyncParaFormat = TRUE;   
    m_lpRichEditOle = NULL;   
    m_nBulletIndent = 720; // 1/2 inch   
    m_nWordWrap = WrapToWindow;   
    m_nPasteType = 0;   
    SetPaperSize(CSize(8*1440+720, 11*1440));   
    SetMargins(CRect(0,0,0,0));   
    m_charformat.cbSize = sizeof(CHARFORMAT2);   
    m_paraformat.cbSize = sizeof(PARAFORMAT2);   
}   

在第一行发现有RICHEDIT_CLASS,顾名思义这是RichEdit类名的意思,查看这个宏所定义的内容,在文件X:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\Richedit.h中开头:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  #define MSFTEDIT_CLASS        L"RICHEDIT50W"  
// NOTE:  MSFTEDIT.DLL only registers MSFTEDIT_CLASS.  If an application wants  
// to use the following Richedit classes, it needs to load the riched20.dll.  
// Otherwise, CreateWindow with RICHEDIT_CLASS would fail.  
// This also applies to any dialog that uses RICHEDIT_CLASS,   
  
// RichEdit 2.0 Window Class   
// On Windows CE, avoid possible conflicts on Win95  
#define CERICHEDIT_CLASSA    "RichEditCEA"  
#define CERICHEDIT_CLASSW    L"RichEditCEW"  
  
#define RICHEDIT_CLASSA        "RichEdit20A"  
#define RICHEDIT_CLASS10A    "RICHEDIT"            // Richedit 1.0  
  
#ifndef MACPORT  
#define RICHEDIT_CLASSW        L"RichEdit20W"  
#else    //----------------------MACPORT   
#define RICHEDIT_CLASSW        TEXT("RichEdit20W")    // MACPORT change   
#endif // MACPORT    
  
#if (_RICHEDIT_VER >= 0x0200 )  
#ifdef UNICODE  
#define RICHEDIT_CLASS        RICHEDIT_CLASSW  
#else  
#define RICHEDIT_CLASS        RICHEDIT_CLASSA  
#endif // UNICODE   
#else  
#define RICHEDIT_CLASS        RICHEDIT_CLASS10A  
#endif // _RICHEDIT_VER >= 0x0200  

摘取那么长的一段,首先RICHEDIT_CLASS在Unicode中代表着"RichEdit20W",否则代表着"RichEdit20A"。另外在上面的语句:

1
2
  #define MSFTEDIT_CLASS        L"RICHEDIT50W"  
// NOTE:  MSFTEDIT.DLL only registers MSFTEDIT_CLASS.  

说明着MSFTEDIT.DLL(即RichEdit4.1版本)注册的类名是"RICHEDIT50W"。继续下一步,因为工程建立的是Unicode,所以CRichEditView的构造函数给CCtrlView的构造函数传了"RichEdit20W"参数,查看CCtrlView的构造函数(在文件X:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\viewcore.cpp中),如下所示:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
  CCtrlView::CCtrlView(LPCTSTR lpszClass, DWORD dwStyle)  
{  
    m_strClass = lpszClass;  
    m_dwDefaultStyle = dwStyle;  
}  
  
BOOL CCtrlView::PreCreateWindow(CREATESTRUCT& cs)  
{  
    ASSERT(cs.lpszClass == NULL);  
    cs.lpszClass = m_strClass;  
  
    // initialize common controls  
    VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));  
    AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);  
  
    // map default CView style to default style  
    // WS_BORDER is insignificant  
    if ((cs.style | WS_BORDER) == AFX_WS_DEFAULT_VIEW)  
        cs.style = m_dwDefaultStyle & (cs.style | ~WS_BORDER);  
  
    return CView::PreCreateWindow(cs);  
}  

可以发现CCtrlView的构造函数里把"RichEdit20W"传给了m_strClass,而在CCtrlView的PreCreateWindow函数里m_strClass做为变量传值给了CREATESTRUCT结构体,CREATESTRUCT结构定义了传递给应用程序的窗口过程的初始化参数。我们只要改变m_strClass类名,就能创建出我们想要的窗口。
实现:
1.在上面的CTest_Richedit工程中,在CTest_RicheditView的构造函数里赋值想要的类名给m_strClass,如下所示:

1
2
3
4
  CTest_RicheditView::CTest_RicheditView() 

    m_strClass = MSFTEDIT_CLASS;     

然后在CTest_RicheditApp里,声明一个HINSTANCE对象,如下所示:

1
2
3
4
5
6
7
8
  class CTest_RicheditApp : public CWinApp  
{  
public:  
    CTest_RicheditApp();  
    virtual ~CTest_RicheditApp();   //重载析构函数  
    HINSTANCE m_hinstRE41;        //声明实例对象  
    //······  
};  

然后在实现文件里面,写入如下代码:

1
2
3
4
5
6
7
8
9
  CTest_RicheditApp::CTest_RicheditApp()  
{  
    m_hinstRE41 = LoadLibrary(_T("msftedit.dll"));      
}  
CTest_RicheditApp::~CTest_RicheditApp()  
{  
    if(m_hinstRE41)  
      FreeLibrary(m_hinstRE41);  
}  

完成,运行程序。用Spy++检测,为"RICHEDIT50W"类名,如下图所示:

对话框方式:
1.在对话框上放置一个Rich Edit 2.0控件;
2.以文本方式打开工程.rc文件,找到描述该控件的地方,如下所示:

1
2
3
4
5
6
7
8
  IDD_ABOUTBOX DIALOGEX 0, 0, 266, 199 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "关于 Test_Richedit" 
FONT 9, "MS Shell Dlg", 0, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON   "确定",IDOK,209,178,50,14,WS_GROUP 
    CONTROL         "",IDC_RICHEDIT21,"RichEdit20W",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,22,32,140,103 
END 

3.把"RichEdit20W"改成"RICHEDIT50W",保存文件。切换到VS,提示重新加载资源文件,确定即可。
4.跟前面的步骤一样,加载"msftedit.dll",运行如下所示:

参考文章:
A Very Simple Way to Use Richedit 5.0 in VC6 and other VS versions  http://www.codeproject.com/KB/edit/UseRichEdit50.aspx

 
 

http://blog.csdn.net/akof1314/article/details/6607265

VC2008下CRichEditView加载RichEdit4.1版本(还有一些类似的文章)的更多相关文章

  1. MUI - 上拉刷新/下拉加载

    新闻信息列表必备的功能,支持Table,Ul等列表. 以下是DIV版本,在安卓端或者ios端必须使用双webview模式,传送门:http://dev.dcloud.net.cn/mui/pulldo ...

  2. H5页面下拉加载更多(实用版)

    近期在做一个H5网站,需要下拉加载更多产品列表的功能.百度搜索了好久,什么说法都有,什么插件都有.   醉了.基本上每一个能直接拿来用的. 最后发现: 1.dropload.js 插件  还可以,但是 ...

  3. 关于MJRefresh的下拉加载数据bug

    当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...

  4. JQuery实现无刷新下拉加载图片

          最近做的一个项目需要做页面无刷新下拉加载图片,调研了一番,大多都采用检测滚动条达到底部,然后利用ajax加载下一页数据对页面数据进行添加,根据这一逻辑,自己写了一个,具体代码如下: JQu ...

  5. 原生JS下拉加载插件分享。

    无聊写了一个JS下拉加载插件,有需要的可以下载. // 使用 // new ManDownLoad("#ul","json/load.json",functio ...

  6. iscroll5 上拉,下拉 加载数据

    我这里的思路是上拉时候只是加载第一页的内容,可根据实际情况修改其中的代码.请勿照搬.样式没怎么调,可以加载gif动画.1.没有数据时候,下拉可以加载数据.2.没有数据时候,点击也可以加载数据.3.其余 ...

  7. ionic下拉加载自动触发

    ionic提供的下拉加载,是要滑动去下拉加载,没有提供api自动触发下拉加载,比如刚进页面,或者切换tab时想触发一次下拉加载. 添加如下service: angular.module('YourAp ...

  8. WP & Win10开发:实现ListView下拉加载的两种方法

    1.通过ListView控件的ContainerContentChanging方法.该方法在列表项被实例化时触发,在列表项最后一个项目实例化的时候触发刷新数据逻辑就可以实现下拉加载了. 代码如下:// ...

  9. 美团、点评、猫眼App下拉加载效果的源码分享

    今天我准备拿大众点评.美团.猫眼电影三款App的实例来分享一下APICloud下拉加载这个模块的效果. 美团App下拉加载效果   以美团中的下拉酷似动画的萌萌着小人儿效果作为参考,来实现的一个加载模 ...

随机推荐

  1. ACM——第几天

    第几天 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 1830            测试通过 : 525 描 ...

  2. ACM——直接插入法排序

    NOJ——1062 直接插入排序 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:446            测试通过:212 ...

  3. SQL 分组后取最小行号记录

    本示例测试两个表联接查询后,分组并取分组后的最小行号记录 测试表: tb1表结构如下: CREATE TABLE [dbo].[tb1]( ) NOT NULL, ) NULL, ) NULL, CO ...

  4. 知乎 zhihu

    知乎上关于美食的精彩问答有哪些? http://www.zhihu.com/question/22744751/answer/22473212 知乎上关于乐队的精彩问答有哪些? http://www. ...

  5. ios面试题集锦(一)

    一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.iOS9有哪些新特性? 答案: 1)改进了 Siri 基于日期.位置和相簿名称来搜索个人照片和视频 要求 Siri 来 ...

  6. 添加数据库的Maven依赖(SqlServer,Oracle)

    oracle: 1.在Oracle官网下载ojdbc的jar包 例:ojdbc7.jar,版本是12.1.0.2,存储地址/home/peng/下载 2.dos中进入存储地址执行如下命令行(注意各项对 ...

  7. C# 并行开发总结

    本文内容 均参考自 <C#并行高级编程> TPL 支持 数据并行(有大量数据要处理,必须对每个数据执行同样的操作, 任务并行(有好多可以并发运行的操作),流水线(任务并行和数据并行的结合体 ...

  8. sgu 102 Coprimes

    太水了, 我都不忍心发题解, 但毕竟是sgu上一道题, 我试试能不能一直这么写下去,就是求phi,上代码 #include <cstdio> #include <cstring> ...

  9. 安卓Fragment和Activity之间的数据通讯

    Fragment是Android3.0之后才推出来的.可以用来做底部菜单,现在很多APP都有用到这个底部菜单.当然TabHost也可以用来做底部菜单,但是Fragment来做,动画效果这些可以做得更炫 ...

  10. 【转载】C#后台声明式验证,远离if验证

    ViewModel public class ViewModel { [Required(ErrorMessage="标题不能为空")] public string Title { ...