• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Scintilla使用指南(1) – 简介

php 搞代码 4年前 (2022-01-22) 55次浏览 已收录 0个评论

Scintilla是一个开源的编辑组件,它不仅具有通常的编辑功能,而且还提供了语法样式、代码折叠、标签、代码自动完成和提示等功能。
Windows版本的Scintilla,是一个标准的Windows组件,用户可以通过SendMessage函数发送消息,与其进行交互。SendMessage函数接口如下所示:

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

GTK+版本的Scintilla,采用和Windows版本相似的方式,进行消息传递。下面的介绍,将以Windows版本为主。
Scintilla提供了大量的消息API,每个消息可以带有0个、1个或2个参数。SendMessage函数中的消息,通常带有2个参数:wParam和lParam,因此对于没有使用的参数,强烈建议将其设置为0,以保证与将来版本的兼容。对于大多数SCI_SETxxxxx设置类消息,都会有一个对应的SCI_GETxxxxx查询消息。

参数类型

消息中的参数类型,如下表所示:

参数类型 参数说明

bool 0表示FALSE,1表示TRUE

int 32位有符号整数

const char* 常量字符串指针,字符串可能以0结尾,或者通过另一个参数指明长度

char* 字符缓冲区指针,Scintilla将会用查询到的字符数据进行填充。在一些情况下,通过另一个参数,指明了缓冲区大小;在另一些情况下,你必须保证缓冲区足够大,可以容纳查询到的字符数据。如果你传入了一个空指针0,消息将返回查询到的字符数据大小。

colour RGB格式的颜色值。每种颜色取值0 – 255,red、green、blue按如下方式组合,得到colour值:colour = red | (green << 8) | (blue << 16)。0x000000,黑色;0xff0000,蓝色;0x00ff00,绿色;0x0000ff,红色;0xffffff,白色。

alpha alpha通道值,表示颜色的半透明度,取值范围为:0(完全透明,SC_ALPHA_TRANSPARENT)- 255(不透明,SC_ALPHA_OPAQUE)。值256(C_ALPHA_NOALPHA)表示不使用alpha通道。并不是所有平台都支持alpha通道,并且只有一部分消息实现了alpha效果。消息默认alpha值为256,不使用alpha通道。

<unused> 未使用参数,强烈建议将其设置为0,以保证与将来版本的兼容

数据类型

在Scintilla中,使用了如下几种数据结构:

CharacterRange

字符范围数据结构,与WIN32数据结构CHARRANGE相同。

struct CharacterRange {long cpMin;long cpMax;};

TextRange

文本范围数据结构,主要用于从Scintilla组件获取指定范围的文本,与WIN32数据结构TEXTRANGE相同。

struct TextRange {struct CharacterRange chrg;char *lpstrText;};

TextToFind

搜索文本数据结构,与WIN32数据结构FINDTEXTEX相同。

struct TextToFind {struct CharacterRange chrg; // 搜索范围char *lpstrText; // 搜索文本struct CharacterRange chrgText; // 匹配文本};

SCNotification

事件通知数据结构。在Windows中,Scintilla将向它的父窗口发送WM_NOTIFY消息;在GTK+中,Scintilla将向它的父窗口发送notify信号。

struct NotifyHeader { // 与WIN32数据结构NMHDR相同void *hwndFrom; // 发送通知的窗口句柄uptr_t idFrom; // 发送通知的控件IDunsigned int code; // SCN_*通知事件代码};struct SCNotification {struct NotifyHeader nmhdr;// SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_DWELLSTART,// SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICKint position;int ch; // SCN_CHARADDED, SCN_KEY// SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICKint modifiers;int modificationType; // SCN_MODIFIED// SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTIONconst char *text;int length; // SCN_MODIFIEDint linesAdded; // SCN_MODIFIEDint message; // SCN_MACRORECORDuptr_t wParam; // SCN_MACRORECORDsptr_t lParam; // SCN_MACRORECORDint line; // SCN_MODIFIED, SCN_DOUBLECLICKint foldLevelNow; // SCN_MODIFIEDint foldLevelPrev; // SCN_MODIFIEDint margin; // SCN_MARGINCLICKint listType; // SCN_USERLISTSELECTION, SCN_AUTOCSELECTIONint x; // SCN_DWELLSTART, SCN_DWELLENDint y; // SCN_DWELLSTART, SCN_DWELLEND};

与MFC的集成

对于MFC应用程序向导创建的多文档程序,只需添加很少的代码,就可以将Scintilla控件嵌入到View中。假设工程名为EasyEdit,则相关的类分别为CEasyEditApp、CEasyEditDoc、CEasyEditView、CChildFrame。
首先,在CEasyEditApp中添加私有成员变量HMODULE m_hmodule和虚函数int ExitInstance(),并增加加载DLL代码和释放DLL代码:

BOOL CEasyEditApp::InitInstance(){m_hmodule = LoadLibrary(_T("SciLexer.dll"));if (NULL == m_hmodule){::MessageBox(NULL, _T("The Scintilla DLL could not be loaded."),_T("Error loading Scintilla"), MB_OK | MB_ICONERROR);}…return TRUE;};int CEasyEditApp::ExitInstance(){// TODO: 在此添加专用代码和/或调用基类if (m_hmodule){FreeLibrary(m_hmodule);}return CWinApp::ExitInstance();}

然后,在CEasyEditView中,增加WM_PAINT消息处理函数void OnPaint(),并在BOOL PreCreateWindow(CREATESTRUCT& cs)和void OnPaint()函数中增加代码:

BOOL CEasyEditView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗口类或样式cs.lpszClass = _T("Scintilla");return CView::PreCreateWindow(cs);}void CEasyEditView::OnPaint(){// CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用CView::OnPaint()Default();}

这样,Scintilla控件就已经集成到View中了。
为了处理Scintilla控件发送的事件通知,在CChildFrame中,增加WM_NOTIFY消息处理函数BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult):

BOOL CChildFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult){// TODO: 在此添加专用代码和/或调用基类SCNotification *pSCNotification = (SCNotification*)lParam;CEasyEditView *pView = (CEasyEditView*)G<em style="color:transparent">本@文来源[email protected]搞@^&代*@码网(</em><q>搞代gaodaima码</q>etActiveView();switch (pSCNotification->nmhdr.code){…}return CMDIChildWnd::OnNotify(wParam, lParam, pResult);}

以上就是Scintilla,简介的内容,更多相关内容请关注搞代码(www.gaodaima.com)!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Scintilla使用指南(1) – 简介

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址