首頁  >  文章  >  後端開發  >  Scintilla使用指南(1) - 簡介

Scintilla使用指南(1) - 簡介

黄舟
黄舟原創
2017-01-17 10:24:212535瀏覽

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查詢訊息。

參數類型

訊息中的參數類型,如下表所示:

參數類型                               0表示FALSE,1表示TRUE
   

int               *              常數字串指針,字串可能以0結尾,或透過另一個參數指明長度
   

char*      填入     在某些情況下,透過另一個參數,指明了緩衝區大小;在其他情況下,你必須保證緩衝區足夠大,可以容納查詢到的字元資料。如果你傳入了一個空指標0,訊息將會回傳查詢到的字元資料大小。
   

colour                    RGB格式中的值色值。每種顏色取值0 - 255,red、green、blue如下組合,得到colour值:colour = red | (green    

alpha                       alpha通道值,表示顏色中的半透明度,且取值範圍為:0(透明,SC_ALPHA_TRANSPARENT)- 2555(AL_ALAHA_TRANSPARENT)-2555(2_ALPHA_TRANSPARENT)-255P(AL_ALPHA_TRANSPARENT)。值256(C_ALPHA_NOALPHA)表示不使用alpha通道。並不是所有平台都支援alpha通道,只有一部分訊息實現了alpha效果。訊息預設alpha值為256,不使用alpha通道。
   

               未使用參數,強烈建議將其設定為0,以確保與未來版本的相容

資料類型

🜟
字符範圍資料結構,與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; // 发送通知的控件ID
unsigned int code; // SCN_*通知事件代码
};
struct SCNotification {
struct NotifyHeader nmhdr;
// SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_DWELLSTART,
// SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
int position;
int ch; // SCN_CHARADDED, SCN_KEY
// SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
int modifiers;
int modificationType; // SCN_MODIFIED
// SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
const char *text;
int length; // SCN_MODIFIED
int linesAdded; // SCN_MODIFIED
int message; // SCN_MACRORECORD
uptr_t wParam; // SCN_MACRORECORD
sptr_t lParam; // SCN_MACRORECORD
int line; // SCN_MODIFIED, SCN_DOUBLECLICK
int foldLevelNow; // SCN_MODIFIED
int foldLevelPrev; // SCN_MODIFIED
int margin; // SCN_MARGINCLICK
int listType; // SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
int x; // SCN_DWELLSTART, SCN_DWELLEND
int 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*)GetActiveView();
switch (pSCNotification->nmhdr.code)
{
…
}
return CMDIChildWnd::OnNotify(wParam, lParam, pResult);
}

以上就是Scintilla,简介的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn