Scintilla 3 24在MFC中的使用 动态 静态
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
Scintilla是一个免费的源代码编辑组件。在这里记录下它在MFC中的使用。
本机环境:Windows XP、Visual Studio 2008 SP1
1.下载Scintilla源代码3.24版本(http://www.scintilla.org/ScintillaDownload.html)。
2.打开VS2008,点击菜单栏"Tools"→"Visual Studio 2008 Command Prompt",cd命令到"..\scintilla\win32"目录,使用以下命令进行编译:
1
|
nmake -f scintilla.mak
|
3.编译完成之后,就可以在"..\scintilla\bin"目录下看到SciLexer.dll和Scintilla.dll。
4.从naughter网站下载MFC封装类(http://www.naughter.com/scintilla.html)。
5.新建一个MFC多文档应用程序,名称为TestScintilla。
6.将ScintillaCtrl.h、ScintillaCtrl.cpp、ScintillaDocView.h、ScintillaDocView.cpp拷贝到工程目录下,加入工程。
7.参考ScintillaDemo工程,创建IDD_SCINTILLA_FINDDLGORD和IDD_SCINTILLA_REPLACEDLGORD对话框。
8.在"stdafx.h"文件添加如下代码:
1
2 3 4 |
#define SCI_NAMESPACE //use Scintilla via a namespace
#include <platform.h> #include <scintilla.h> #include <SciLexer.h> |
替换CTestScintillaView基类为Scintilla::CScintillaView,替换CTestScintillaDoc基类为Scintilla::CScintillaDoc,在APP应用程序类添加如下变量:
1
|
HMODULE m_hSciDLL;
|
在InitInstance函数,添加如下代码:
1
2 3 4 5 6 |
m_hSciDLL = LoadLibrary(_T("SciLexer.dll"));
if (m_hSciDLL == NULL) { AfxMessageBox(_T("SciLexer DLL is not installed.")); return FALSE; } |
重载ExitInstance函数,添加如下代码:
1
2 3 4 |
if (m_hSciDLL)
{ FreeLibrary(m_hSciDLL); } |
9.编译,将SciLexer.dll放到程序目录下,运行程序,这时可以看到编辑器已经出来了,如下图所示:
10.重载CTestScintillaView的OnInitialUpdate方法,代码如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
const TCHAR cppKeyWords[] =
_T("and and_eq asm auto bitand bitor bool break ") _T("case catch char class compl const const_cast continue ") _T("default delete do double dynamic_cast else enum explicit export extern false float for ") _T("friend goto if inline int long mutable namespace new not not_eq ") _T("operator or or_eq private protected public ") _T("register reinterpret_cast return short signed sizeof static static_cast struct switch ") _T("template this throw true try typedef typeid typename union unsigned using ") _T("virtual void volatile wchar_t while xor xor_eq "); void CTestScintillaView::OnInitialUpdate() CScintillaCtrl& rCtrl = GetCtrl(); //Setup the Lexer //Setup styles |
设定C++语法解析器,设定高亮关键字,设定文本风格,再次编译运行,效果如下图所示:
示例代码下载:http://download.csdn.net/detail/akof1314/5069136
静态编译步骤如下:
1.创建一个静态库工程,名称为:ScintillaLib。
2.将scintilla源代码文件夹放到工程目录下,将lexers、lexlib、src、win32目录下的文件添加到工程。
3.工程属性,C/C++→General→Additional Include Directories填入.\scintilla\include;.\scintilla\lexlib;.\scintilla\src
C/C++→Preprocessor→Preprocessor Definitions填入STATIC_BUILD;SCI_LEXER
4.注释掉CheckD2D.cxx文件里面的内容。
5.编译完成。
6.使用上面的测试工程,在CTestScintillaApp的InitInstance函数,加入以下代码:
1
|
Scintilla_RegisterClasses(AfxGetInstanceHandle());
|
在ExitInstance函数,加入以下代码:
1
|
Scintilla_ReleaseResources();
|
7.工程属性,Linker→Input→Additional Dependencies填入ScintillaLib.lib IMM32.lib
8.编译运行。
示例代码下载:http://download.csdn.net/detail/akof1314/5069143
排除掉不需要的语言解析器:
1.删除掉"..\scintilla\lexers"目录下不需要的语言解析器对应的Lex*.cxx文件,比如这里只留下LexCPP.cxx文件。
2.打开"..\scintilla\src\Catalogue.cxx"文件,找到如下位置
1
|
//++Autogenerated -- run src/LexGen.py to regenerate
|
然后删除LINK_LEXER(...);使其剩下
1
2 |
LINK_LEXER(lmCPP);
LINK_LEXER(lmCPPNoCase); |
打开"..\scintilla\win32\scintilla.mak"文件,找到如下位置
1
2 |
#++Autogenerated -- run src/LexGen.py to regenerate
#**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) |
删除掉$(DIR_O)\Lex***.obj \使其剩下
1
2 3 4 5 6 |
#++Autogenerated -- run src/LexGen.py to regenerate
#**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) LEXOBJS=\ $(DIR_O)\LexCPP.obj \ #--Autogenerated -- end of automatically generated section |
然后再找到如下位置
1
2 |
#++Autogenerated -- run src/LexGen.py to regenerate
#**\n\($(DIR_O)\\\*.obj: ..\\lexers\\\*.cxx $(LEX_HEADERS)\n\n\) |
删除掉$(DIR_O)\Lex***.obj: ..\lexers\Lex***.cxx $(LEX_HEADERS)使其剩下
1
2 3 4 5 6 7 |
#++Autogenerated -- run src/LexGen.py to regenerate
#**\n\($(DIR_O)\\\*.obj: ..\\lexers\\\*.cxx $(LEX_HEADERS)\n\n\) $(DIR_O)\LexCPP.obj: ..\lexers\LexCPP.cxx $(LEX_HEADERS) #--Autogenerated -- end of automatically generated section |
3.保存改动,打开VS2008,点击菜单栏"Tools"→"Visual Studio 2008 Command Prompt",cd命令到"..\scintilla\win32"目录,使用以下命令进行编译:
1
|
nmake -f scintilla.mak
|
4.编译完成之后,SciLexer.dll为348KB,未精简前为649KB大小。
参考资料:
1.Scintilla Documentation http://www.scintilla.org/ScintillaDoc.html
2.MFC classes to encapsulate the Scintilla edit control http://www.naughter.com/scintilla.html
3.语法高亮编辑控件Scintilla在MFC中的简单使用 http://www.qingfengju.com/article.asp?id=14
4.用Scintilla让程序支持语法高亮并且编译 http://hi.baidu.com/kxw102/item/b7e701a569d685de5af19138
5.Scintilla开源库使用指南 http://www.cnblogs.com/superanyi/archive/2011/04/07/2008632.html
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
Scintilla 3 24在MFC中的使用 动态 静态相关推荐
- MFC中显示图片(静态、动态)(转)
(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对 ...
- mfc c语言 编辑器,语法高亮编辑控件Scintilla在MFC中的简单使用
项目中要使用代码编辑器,搜索之后,发现了强大的编辑器控件Scintilla. 1.简介 Scintilla是一款开源的语法高亮编辑器控件,官方网站:http://www.scintilla.org/. ...
- MFC中的几个常用类——CWnd
2019独角兽企业重金招聘Python工程师标准>>> 1 窗口类 1.1 概述 CObject └CCmdTarget └CWnd CWnd是MFC窗口类的 基类,提供了微软基础类 ...
- MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置
在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...
- Magick++ 6.8.5在MFC中的使用
Magick++是ImageMagick图像库的C++封装.ImageMagick是一个集创建.编辑.合成和转换图像格式的软件套件. 编译步骤: 1.从http://www.imagemagick.o ...
- mfc中字体设置详解
为了能选用不同的字体和大小来输出文本串,须使用作为GDI对象的 CFont类.Windows和常用的字处理软件(如Word).绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要 ...
- 调用opencv3.x 库,在MFC中显示图片
调用opencv3.x 库,在MFC中显示图片 使用opencv和MFC显示图片的方法大致分为以下几种: 1:将opencv的显示对话框嵌入到MFC窗口. 2:使用CvvImage类显示图片. 3:将 ...
- MFC中使用Sqllite数据库
1.今天已经10.24号了,最近一个半月一直忙其它的工作了,正好今天是程序员节,记录一下MFC中Sqllite数据库的使用,之前在QT中已经使用过Sqllite数据库了. 封装类: #pragma o ...
- MFC中快速应用OpenCV(转)
转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...
最新文章
- 【opencv】(2) 图像处理:边界填充、图像融合、图像阈值、数值计算
- python3编写简易统计服务器
- iOS端Socket(二)ProtocolBuffer使用
- linux漏洞知乎_安装 Manjaro Linux 后必做的 6 件事 | Linux 中国
- windows2003+PHP-5.3.8+IIS6.0的安装配置
- JavaScript实现按键精灵
- 在Graphite中存储Hystrix的几个月历史指标
- java 执行js selenium_如何在Selenium WebDriver Java中使用JavaScript
- 六款WEB上传组件性能测试与比较
- centos 虚拟机glibc升级_CentOS 6 glibc升级到2.15
- JAVA使用Gson解析json数据,实例
- app开发前后端简易流程图
- 如何利用软文营销将好品牌故事?
- F5安全专栏 | 什么是零信任架构(ZTA)?
- 如何预防 XSS 攻击
- 云计算对传统软件工程的影响
- 使用约会应用Tinder时没人关注你?花钱就能插队露脸半小时
- 隔壁老王的iptables防火墙
- Buhtrap在最新监控活动中使用多个0 day漏洞
- 防疫与复工同行,长沙望城进入“双统筹”的关键时刻
热门文章
- 行为设计模式 - 策略设计模式
- python读取html文件中的表格数据_使用解析html表pd.read_html文件其中单元格本身包含完整表...
- C#委托和事件实现观察者模式
- 面试刷题29:mysql事务隔离实现原理?
- Yarn报错:error Couldn‘t publish package: “https://registry。。。 Are you logged in as the correct user?“
- PLSQL Developer连接数据库报错ora-12514解决
- javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码
- 如果成为一名高级安卓开发_想成为一名开发人员? 这是您需要考虑的。
- vscode设置go-lint警告提示
- Xshell连接Ubuntu时提示SSH服务器拒绝了密码