Scintilla/How to use the Scintilla Edit Control on Windows

Last-modified: 2008-02-25 (月) 19:32:09

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;