分享一下我老师大神的人工智能教程!零基础,通俗易懂!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.dllScintilla.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.重载CTestScintillaViewOnInitialUpdate方法,代码如下:

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()
{
    CScintillaView::OnInitialUpdate();

CScintillaCtrl& rCtrl = GetCtrl();

//Setup the Lexer
    rCtrl.SetLexer(SCLEX_CPP);
    rCtrl.SetKeyWords(0, cppKeyWords);

//Setup styles
    rCtrl.StyleSetFore(STYLE_DEFAULT, RGB(0, 0, 0));
    rCtrl.StyleSetBack(STYLE_DEFAULT, RGB(0xff, 0xff, 0xff));
    rCtrl.StyleSetSize(STYLE_DEFAULT, 11);
    rCtrl.StyleSetFont(STYLE_DEFAULT, "Verdana");
    rCtrl.StyleClearAll();
    rCtrl.StyleSetFore(SCE_C_DEFAULT, RGB(0, 0, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENT, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENTLINE, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENTDOC, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENTLINEDOC, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENTDOCKEYWORD, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_COMMENTDOCKEYWORDERROR, RGB(0, 0x80, 0));
    rCtrl.StyleSetFore(SCE_C_NUMBER, RGB(0, 0x80, 0x80));
    rCtrl.StyleSetFore(SCE_C_WORD, RGB(0, 0, 0x80));
    rCtrl.StyleSetBold(SCE_C_WORD, 1);
    rCtrl.StyleSetFore(SCE_C_STRING, RGB(0x80, 0, 0x80));
    rCtrl.StyleSetFore(SCE_C_IDENTIFIER, RGB(0, 0, 0));
    rCtrl.StyleSetFore(SCE_C_PREPROCESSOR, RGB(0x80, 0, 0));
    rCtrl.StyleSetFore(SCE_C_OPERATOR, RGB(0x80, 0x80, 0));
}

设定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.使用上面的测试工程,在CTestScintillaAppInitInstance函数,加入以下代码:

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中的使用 动态 静态相关推荐

  1. MFC中显示图片(静态、动态)(转)

    (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对 ...

  2. mfc c语言 编辑器,语法高亮编辑控件Scintilla在MFC中的简单使用

    项目中要使用代码编辑器,搜索之后,发现了强大的编辑器控件Scintilla. 1.简介 Scintilla是一款开源的语法高亮编辑器控件,官方网站:http://www.scintilla.org/. ...

  3. MFC中的几个常用类——CWnd

    2019独角兽企业重金招聘Python工程师标准>>> 1 窗口类 1.1 概述 CObject └CCmdTarget └CWnd CWnd是MFC窗口类的 基类,提供了微软基础类 ...

  4. MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置

    在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect  r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...

  5. Magick++ 6.8.5在MFC中的使用

    Magick++是ImageMagick图像库的C++封装.ImageMagick是一个集创建.编辑.合成和转换图像格式的软件套件. 编译步骤: 1.从http://www.imagemagick.o ...

  6. mfc中字体设置详解

    为了能选用不同的字体和大小来输出文本串,须使用作为GDI对象的 CFont类.Windows和常用的字处理软件(如Word).绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要 ...

  7. 调用opencv3.x 库,在MFC中显示图片

    调用opencv3.x 库,在MFC中显示图片 使用opencv和MFC显示图片的方法大致分为以下几种: 1:将opencv的显示对话框嵌入到MFC窗口. 2:使用CvvImage类显示图片. 3:将 ...

  8. MFC中使用Sqllite数据库

    1.今天已经10.24号了,最近一个半月一直忙其它的工作了,正好今天是程序员节,记录一下MFC中Sqllite数据库的使用,之前在QT中已经使用过Sqllite数据库了. 封装类: #pragma o ...

  9. 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 简介和缘 ...

最新文章

  1. 【opencv】(2) 图像处理:边界填充、图像融合、图像阈值、数值计算
  2. python3编写简易统计服务器
  3. iOS端Socket(二)ProtocolBuffer使用
  4. linux漏洞知乎_安装 Manjaro Linux 后必做的 6 件事 | Linux 中国
  5. windows2003+PHP-5.3.8+IIS6.0的安装配置
  6. JavaScript实现按键精灵
  7. 在Graphite中存储Hystrix的几个月历史指标
  8. java 执行js selenium_如何在Selenium WebDriver Java中使用JavaScript
  9. 六款WEB上传组件性能测试与比较
  10. centos 虚拟机glibc升级_CentOS 6 glibc升级到2.15
  11. JAVA使用Gson解析json数据,实例
  12. app开发前后端简易流程图
  13. 如何利用软文营销将好品牌故事?
  14. F5安全专栏 | 什么是零信任架构(ZTA)?
  15. 如何预防 XSS 攻击
  16. 云计算对传统软件工程的影响
  17. 使用约会应用Tinder时没人关注你?花钱就能插队露脸半小时
  18. 隔壁老王的iptables防火墙
  19. Buhtrap在最新监控活动中使用多个0 day漏洞
  20. 防疫与复工同行,长沙望城进入“双统筹”的关键时刻

热门文章

  1. 行为设计模式 - 策略设计模式
  2. python读取html文件中的表格数据_使用解析html表pd.read_html文件其中单元格本身包含完整表...
  3. C#委托和事件实现观察者模式
  4. 面试刷题29:mysql事务隔离实现原理?
  5. Yarn报错:error Couldn‘t publish package: “https://registry。。。 Are you logged in as the correct user?“
  6. PLSQL Developer连接数据库报错ora-12514解决
  7. javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码
  8. 如果成为一名高级安卓开发_想成为一名开发人员? 这是您需要考虑的。
  9. vscode设置go-lint警告提示
  10. Xshell连接Ubuntu时提示SSH服务器拒绝了密码