ホームページ  >  記事  >  バックエンド開発  >  Scintilla ユーザー ガイド (1) - はじめに

Scintilla ユーザー ガイド (1) - はじめに

黄舟
黄舟オリジナル
2017-01-17 10:24:212494ブラウズ

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

データ型

SCINTILA では、次のデータ構造が使用されます。文字範囲データ構造は、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 は親ウィンドウに通知信号を送信します。


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 までご連絡ください。