VC2008下CRichEditView加载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版本(还有一些类似的文章)的更多相关文章
- MUI - 上拉刷新/下拉加载
新闻信息列表必备的功能,支持Table,Ul等列表. 以下是DIV版本,在安卓端或者ios端必须使用双webview模式,传送门:http://dev.dcloud.net.cn/mui/pulldo ...
- H5页面下拉加载更多(实用版)
近期在做一个H5网站,需要下拉加载更多产品列表的功能.百度搜索了好久,什么说法都有,什么插件都有. 醉了.基本上每一个能直接拿来用的. 最后发现: 1.dropload.js 插件 还可以,但是 ...
- 关于MJRefresh的下拉加载数据bug
当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...
- JQuery实现无刷新下拉加载图片
最近做的一个项目需要做页面无刷新下拉加载图片,调研了一番,大多都采用检测滚动条达到底部,然后利用ajax加载下一页数据对页面数据进行添加,根据这一逻辑,自己写了一个,具体代码如下: JQu ...
- 原生JS下拉加载插件分享。
无聊写了一个JS下拉加载插件,有需要的可以下载. // 使用 // new ManDownLoad("#ul","json/load.json",functio ...
- iscroll5 上拉,下拉 加载数据
我这里的思路是上拉时候只是加载第一页的内容,可根据实际情况修改其中的代码.请勿照搬.样式没怎么调,可以加载gif动画.1.没有数据时候,下拉可以加载数据.2.没有数据时候,点击也可以加载数据.3.其余 ...
- ionic下拉加载自动触发
ionic提供的下拉加载,是要滑动去下拉加载,没有提供api自动触发下拉加载,比如刚进页面,或者切换tab时想触发一次下拉加载. 添加如下service: angular.module('YourAp ...
- WP & Win10开发:实现ListView下拉加载的两种方法
1.通过ListView控件的ContainerContentChanging方法.该方法在列表项被实例化时触发,在列表项最后一个项目实例化的时候触发刷新数据逻辑就可以实现下拉加载了. 代码如下:// ...
- 美团、点评、猫眼App下拉加载效果的源码分享
今天我准备拿大众点评.美团.猫眼电影三款App的实例来分享一下APICloud下拉加载这个模块的效果. 美团App下拉加载效果 以美团中的下拉酷似动画的萌萌着小人儿效果作为参考,来实现的一个加载模 ...
随机推荐
- Android——获取网络图片
布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...
- [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】
第二章Shell的结构 “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...
- oc 基础知识
一.枚举 结构体 typedef enum{ sexMan, sexWoman }Sex; tydedef struct{ int year; int month; int da ...
- C#break、continue、return、goto
1.break break语句会使运行的程序立即退出包含在其中的最内层循环(结束此次循环且结束该循环控制体)或者switch语句 ; ; j < ; j++) { i++; )break; Co ...
- C# ACM poj1007
求逆序数,快排 public static void acm1007(int a, string[] c) { Dictionary<int, string> dic = new Dict ...
- (转).Net平台开源作业调度框架Quartz.Net
Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...
- jQuery 源码分析 7: sizzle
jQuery使用的是sizzle这个选择器引擎,这个引擎以其高速著称,其实现十分精妙但是也足够复杂,下面现简单分析一下相关的代码. 在jQuery的部分API接口是直接引用了Sizzle的方法,这些接 ...
- java多线程之停止线程
/*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...
- [leetcode]最长递增序列
class Solution { public: int lengthOfLIS(vector<int>& nums) { int n=nums.size(); ) ; vecto ...
- Windows 7 Shortcuts (完整兼具分类有序,想我所想,赞!)
Original Link: http://www.shortcutworld.com/en/win/Windows_7.html Table of Contents: Managing 'Windo ...