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將會用查詢到的字元資料進行填充。在一些情況下,通過另一個參數,指明了緩衝區大小;在另一些情況下,你必須保證緩衝區足夠大,可以容納查詢到的字元資料。如果你傳入了一個null 指標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*)GetActiveView();switch (pSCNotification->nmhdr.code){…}return CMDIChildWnd::OnNotify(wParam, lParam, pResult);}
以上就是Scintilla,簡介的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!