MFC如何使用开源Scintilla库?自动源码质量控制软件 iCode 编写全记录(一)

来源:互联网 发布:值得买源码 编辑:程序博客网 时间:2024/06/16 17:58

使用的是Scintilla库+VS2010

下面是关于Scintilla库介绍的引用,都百度的到,不想看的可以跳过。直接看VS2010实战部分。

Scintilla库是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。从这里下载Scintilla库:http://scintilla.sourceforge.net/ScintillaDownload.html还有有Scinilla相关的库下载,比如wxStyledTextCtrl就是Scintilla的wxWidgets移植版。http://www.scintilla.org/ScintillaRelated.html另外,Scintilla的作者为了演示这个东东的功能,编写了一个叫SciTE的演示程序。不过这个程序的功能已经强大到足以作为我们的常用代码编辑器,很值得下载下来学习学习。
<p style="color: rgb(51, 51, 51); font-family: verdana, 宋体, Arial; font-size: 13px; line-height: 24px; margin: 5px auto; padding-top: 0px; padding-bottom: 0px;">首先进入scintilla的win32目录:</p><pre class="toc" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-size: 13px; line-height: 24px; background-color: rgb(255, 255, 255); margin-top: 0px; margin-bottom: 0px; padding: 0px;">cd scintilla\win32
  • 对于mingw,输入:
    mingw32-make
  • 对于VC6以上版本,输入:
    nmake -f scintilla.mak
  • 对于VC6(没试过,从Readme里看来的),输入:
    nmake -f scintilla_vc6.mak
  • 对于C++Builder,输入:
    make -fscintilla.mak

编译完成后,在bin目录里会得到Scintilla.dll和SciLexer.dll文件,SciLexer.dll是包含了语法解析器 (Lexer)的Scintilla控件,一般来说我们只要用它就可以了。

需要说明的是,不管是用什么编译器生成的DLL文件,都可以供给其它编译器使用(就象系统DLL一样,任何编译器都能使用),所以不用为各种编译器都编译 一份。

如果觉得生成的SciLexer.dll太大的话,可以考虑去除自带的部分语法解析器。比如你打算只用它来高亮C++代码的话,可以:

  1. 进到src目录里,移除除LexCPP.cxx以外的所有Lex*.cxx文件
  2. 执行LexGen.py重建make文件和KeyWords.cxx文件(需要安装Python)。
  3. 重新按前面的方法编译,这样生成的SciLexer.dll就只带有C++语法解析器了,体积也大小减小了(我VC编译的结果是从1.4M减小到 206K)。

---------------------------------------------------------------------------------------------------------------------------------
下面开始VS2010实战部分,真是呕心沥血,大部分问题都百度不到。。

首先是编译dll文件。(Scintilla分静态编译和动态编译,作为开源软件,如果你没有什么特殊需求,最好直接动态编译成DLL)
使用的是 开始菜单里 VS2010安装目录下 TOOLS里的 Visual Studio 命令提示(2010)(千万别用什么带X64的 实测编译出来的东西,用Depends都打不开,别说用程序LoadLibrary了)
CMD里,跳转到scintilla里的WIN32目录,执行nmake -f scintilla.mak即可编译。如果不行,可以直接下载个最新版的SciTE,把里面的DLL拷过来;

然后按自己的需求,利用VS向导,新建一个多文档。

ScintillaCtrl.h、ScintillaCtrl.cpp、ScintillaDocView.h、ScintillaDocView.cpp拷贝到工程目录下,加入工程。

创建IDD_SCINTILLA_FINDDLGORD和IDD_SCINTILLA_REPLACEDLGORD对话框。

此时编译,会提示缺少IDC神马神马的 那个是搜索是用到的正则表达式,需要在新建的两个对话框里,拖两个checkbox控件,然后把他们的名字改成那个就行了。

替换CTestScintillaView基类为Scintilla::CScintillaView,替换CTestScintillaDoc基类为Scintilla::CScintillaDoc,

注意替换,是所有用到CDoc,CView的地方都替换掉,如BEGIN_MESSAGE_MAP(CtestView, CScintillaView),不然一开始运行会报错,断点停留在INCALL处(调试了半天才发现)

在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放到程序目录下,运行程序,

virtual void OnInitialUpdate();添加在h的public重写处,添加在class的尾部可能会导致编译器无法识别CScintillaCtrl& rCtrl = GetCtrl();

0 0