WindowsでのScintillaエディットコントロールの使い方
WindowsでScintillaのEditコントロールを使う方法
Windows環境でScintillaを使う方法をステップバイステップで説明する。
ScintillaのEditコントロールを生成する方法
まず、以下のようにScintillaのDLLをロードする。
hmod = LoadLibrary("SciLexer.DLL"); if (hmod==NULL) { MessageBox(hwndParent, "The Scintilla DLL could not be loaded.", "Error loading Scintilla", MB_OK); }
訳注: Wikiの都合により上記のコードはオリジナルと若干違います。
DLLのロードが成功すれば、DLLは新しいウインドウクラスを登録する。
新しいScintilla編集コントロールは"Scintilla"という名前である。
ほかのWindowsコントロールののように新しいコントロールを使うことができる。
hwndScintilla = CreateWindowEx(0, "Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN, 10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);
新しいウインドウクラス名は"Scintilla"である。
このポイントに達することで、Scintilla編集コントロールがあなたのWindowsプログラムに含まれる。
Scintilla編集コントロールの制御方法
あなたはEditコントロールにコマンドを送信することでScintillaを制御できる。
これをする2種類の方法がある。
簡単な方法と速い方法である。
Scintillaを制御する簡単な方法
簡単な方法はほかのWindowsコントロールと似ている。
ScintillaのEditコントロールにメッセージを送信し、コントロールから通知を受信することができる。
(通知はScintillaのEditコントロールの親ウインドウに送信されることに注意すること。)
ScintillaのEditコントロールはそれぞれのコマンドのために特別なメッセージを知っている。
ScintillaのEditコントロールにコマンドを送信するSendMessage関数を使うことができる。
SendMessage(hwndScintilla,sci_command,wparam,lparam);
たとえば:
SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0);
いくつかのコマンドは値を返し、未使用の引数はNULLにセットすべきである。
Scintillaを制御する速い方法
ScintillaのEditコントロールを制御する速い方法は、あなた自身がメッセージハンドリング関数を呼ぶことである。
あなたはScintillaのEditコントロールのメッセージハンドリング関数のポインタを取得し、直接コマンドを実行する。
この方法はSendMessage()の方法よりはるかに速い。
SCI_GETDIRECTFUNCTIONとSCI_GETDIRECTPOINTERコマンドを使って関数ポインタを取得し、呼び出しで取得した関数ポインタの第一引数に指定する。
あなたはSendMessageの方法でこれを行う。:)
次のようになる:
int (*fn)(void*,int,int,int); void * ptr; int canundo;
fn = (int (__cdecl *)(void *,int,int,int))SendMessage( hwndScintilla,SCI_GETDIRECTFUNCTION,0,0); ptr = (void *)SendMessage(hwndScintilla,SCI_GETDIRECTPOINTER,0,0);
canundo = fn(ptr,SCI_CANUNDO,0,0);
Scintillaコントロールのメッセージハンドリング関数の関数ポインタとして"fn"、第一引数に使うポインタとして"ptr"がある。
第二引数以降は、2個の引数(オプション)でScintillaコマンドである。
通知を受信する方法
Scintillaが何かを知らせたがっているときはイベントを発生させ、ScintillaのEditコントロールは親ウインドウに通知を送信する。
WM_NOTIFYメッセージがこれをする。
メッセージを受信したとき、実際のメッセージのxxx構造を見る。
Scintillaの親ウインドウのメッセージハンドリング関数は、次のような何らかのコードを入れる:
NMHDR *lpnmhdr;
[...]
case WM_NOTIFY: lpnmhdr = (LPNMHDR) lParam;
if(lpnmhdr->hwndFrom==hwndScintilla) { switch(lpnmhdr->code) { case SCN_CHARADDED: /* Hey, Scintilla just told me that a new */ /* character was added to the Edit Control.*/ /* Now i do something cool with that char. */ break; } } break;