Scintilla は、通常の編集機能だけでなく、構文スタイル、コードの折りたたみ、タグ、コードのオートコンプリート、プロンプトなどの機能も提供するオープンソースの編集コンポーネントです。
Scintilla の Windows バージョンは標準の Windows コンポーネントであり、ユーザーは SendMessage 関数を通じてメッセージを送信し、対話することができます。 SendMessage 関数のインターフェイスは次のとおりです。
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
Scintilla の GTK+ バージョンは、メッセージ配信に Windows バージョンと同様の方法を使用します。以下の紹介では Windows バージョンに焦点を当てます。
Scintilla は多数のメッセージ API を提供し、各メッセージには 0、1、または 2 つのパラメーターを含めることができます。通常、SendMessage 関数のメッセージには、wParam と lParam という 2 つのパラメータがあります。そのため、未使用のパラメータについては、将来のバージョンとの互換性を確保するために 0 に設定することを強くお勧めします。ほとんどの SCI_SETxxxxx 設定メッセージには、対応する SCI_GETxxxxx クエリ メッセージがあります。
パラメータの種類
メッセージ内のパラメータの種類は次の表のとおりです。
パラメータの種類パラメータの種類 TRUE を示します
int 32 ビット符号付き整数
const char *定数文字列ポインタ、 string は 0 で終わるか、別のパラメータを通じて
Char*character バッファ ポインタの長さを示すことができます。SCINTILLA はクエリを実行する文字データを使用して埋めます。バッファ サイズが別のパラメータで指定される場合もありますが、クエリされる文字データを収容できる十分な大きさのバッファを確保する必要がある場合もあります。 null ポインタ 0 を渡すと、メッセージはクエリされた文字データ サイズを返します。
colour RGB 形式のカラー値。各色の値は 0 ~ 255 です。赤、緑、青を次のように組み合わせて色の値を取得します: color = red | (green << 8) | (blue << 16)。 0x000000、黒、0xff0000、緑、0xffffff、 AAlpha アルファ チャネル値は色の半透明度を示します。値の範囲は 0 (完全に透明、sc_alpha_transparent) ~ 255 (不透明、sc_alPhaque) です。値 256 (C_ALPHA_NOALPHA) は、アルファ チャネルを使用しないことを意味します。すべてのプラットフォームがアルファ チャネルをサポートしているわけではなく、一部のメッセージのみがアルファ エフェクトを実装します。メッセージのデフォルトのアルファ値は 256 で、アルファ チャネルは使用されません。 & & Lt; 未使用 & gt; 未使用のパラメータは、将来のバージョンとの互換性を確保するために 0 に設定することを強くお勧めします。
データ型
struct CharacterRange { long cpMin; long cpMax; };
テキスト範囲データ構造。主に Scintilla コンポーネントから指定されたテキスト範囲を取得するために使用されます。WIN32 データ構造 TEXTRANGE と同じです。
struct TextRange { struct CharacterRange chrg; char *lpstrText; };
TextToFind
struct TextToFind {struct CharacterRange chrg; // 搜索范围char *lpstrText; // 搜索文本struct CharacterRange chrgText; // 匹配文本};
SCNotification
イベント通知データ構造。 Windows では、Scintilla は WM_NOTIFY メッセージを親ウィンドウに送信します。GTK+ では、Scintilla は親ウィンドウに通知信号を送信します。
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)!