项目中要使用代码编辑器,搜索之后,发现了强大的编辑器控件Scintilla。
1.简介
Scintilla是一款开源的语法高亮编辑器控件,官方网站:http://www.scintilla.org/。Scintilla是最优秀的编辑控件之一,实现了语法高亮,代码折叠,书签,自动完成等等诸多功能,速度快,源代码也比较好理解,易于扩展,易于增加对新语言的支持。 比较著名的scite,Notepad++,Notepad2都是基于Scintilla开发的。Scintilla提供了Win32版本和Linux版本,在Windows下,它是一个窗体控件,对它的控制都通过发送消息来完成:
LRESULT SendMessage(HWND hWndScintilla,UINT Msg,WPARAM wParam,LPARAM lParam);
Scintilla提供了大量的消息API,每个消息可以带有0个、1个或2个参数。SendMessage函数中的消息,通常带有2个参数:wParam和lParam,没有使用的参数,则设置为0。对于大多数SCI_SETxxxxx设置类消息,都会有一个对应的SCI_GETxxxxx查询消息。
下面的图片是一个数控NC程序编辑器Demo:
2.在MFC中的简单使用
2.1载入Scintilla链接库
首先,将SciLexer.dll复制到项目中。
a.在CwinApp下添加成员:
HMODULE m_hDll;
并初始化为NULL。
b.在InitInstance中载入DLL:
C++代码
m_hDll = LoadLibrary(_T("SciLexer.dll"));
if(m_hDll==NULL)
{
AfxMessageBox("LoadLibrary SciLexer.dll failure...");
}
c.在ExitInstance中卸载DLL:
C++代码
if (m_hDll != NULL)
{
FreeLibrary(m_hDll);
}
2.2 创建一个封装Scintilla的类 — CScintillaWnd
C++代码
//-------------------------------------------------------
// ScintillaWnd.h
#pragma once
//注意:这俩文件来自Scintilla的include目录
#include "Scintilla.h"
#include "SciLexer.h"
// CScintillaWnd
classCScintillaWnd :publicCWnd
{
DECLARE_DYNAMIC(CScintillaWnd)
public:
CScintillaWnd();
virtual