Scintilla是一个免费的源代码编辑组件。在这里记录下它在MFC中的使用。
本机环境:Windows XP、Visual Studio 2008 SP11.下载Scintilla源代码3.24版本()。2.打开VS2008,点击菜单栏"Tools"→"Visual Studio 2008 Command Prompt",cd命令到"..\scintilla\win32"目录,使用以下命令进行编译:
1
nmake-fscintilla.mak
3.编译完成之后,就可以在"..\scintilla\bin"目录下看到SciLexer.dll和Scintilla.dll。4.从naughter网站下载MFC封装类()。5.新建一个MFC多文档应用程序,名称为TestScintilla。6.将ScintillaCtrl.h、ScintillaCtrl.cpp、ScintillaDocView.h、ScintillaDocView.cpp拷贝到工程目录下,,加入工程。7.参考ScintillaDemo工程,创建IDD_SCINTILLA_FINDDLGORD和IDD_SCINTILLA_REPLACEDLGORD对话框。8.在"stdafx.h"文件添加如下代码:
1234
#defineSCI_NAMESPACE//useScintillaviaanamespace#include<platform.h>#include<scintilla.h>#include<SciLexer.h>
替换CTestScintillaView基类为Scintilla::CScintillaView,替换CTestScintillaDoc基类为Scintilla::CScintillaDoc,在APP应用程序类添加如下变量:
1
HMODULEm_hSciDLL;
在InitInstance函数,添加如下代码:
123456
m_hSciDLL=LoadLibrary(_T("SciLexer.dll"));if(m_hSciDLL==NULL){AfxMessageBox(_T("SciLexerDLLisnotinstalled."));returnFALSE;}
重载ExitInstance函数,添加如下代码:
1234
if(m_hSciDLL){FreeLibrary(m_hSciDLL);}
9.编译,将SciLexer.dll放到程序目录下,运行程序,这时可以看到编辑器已经出来了,如下图所示:
10.重载CTestScintillaView的OnInitialUpdate方法,代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041
constTCHARcppKeyWords[]=_T("andand_eqasmautobitandbitorboolbreak")_T("casecatchcharclasscomplconstconst_castcontinue")_T("defaultdeletedodoubledynamic_castelseenumexplicitexportexternfalsefloatfor")_T("friendgotoifinlineintlongmutablenamespacenewnotnot_eq")_T("operatororor_eqprivateprotectedpublic")_T("registerreinterpret_castreturnshortsignedsizeofstaticstatic_caststructswitch")_T("templatethisthrowtruetrytypedeftypeidtypenameunionunsignedusing")_T("virtualvoidvolatilewchar_twhilexorxor_eq");voidCTestScintillaView::OnInitialUpdate(){CScintillaView::OnInitialUpdate();CScintillaCtrl&rCtrl=GetCtrl();//SetuptheLexerrCtrl.SetLexer(SCLEX_CPP);rCtrl.SetKeyWords(0,cppKeyWords);//SetupstylesrCtrl.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,0×80,0));rCtrl.StyleSetFore(SCE_C_COMMENTLINE,RGB(0,0×80,0));rCtrl.StyleSetFore(SCE_C_COMMENTDOC,RGB(0,0×80,0));rCtrl.StyleSetFore(SCE_C_COMMENTLINEDOC,RGB(0,0×80,0));rCtrl.StyleSetFore(SCE_C_COMMENTDOCKEYWORD,RGB(0,0×80,0));rCtrl.StyleSetFore(SCE_C_COMMENTDOCKEYWORDERROR,RGB(0,0×80,0));rCtrl.StyleSetFore(SCE_C_NUMBER,RGB(0,0×80,0x80));rCtrl.StyleSetFore(SCE_C_WORD,RGB(0,0,0×80));rCtrl.StyleSetBold(SCE_C_WORD,1);rCtrl.StyleSetFore(SCE_C_STRING,RGB(0x80,0,0×80));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));}
穿越茫茫人海,寻找属于我们的那一份宁静。