신틸라 편집 콘트롤을 윈도우즈에서 사용하는 법

다음은 윈도우즈 환경에서 신틸라를 사용하는 법을 단계별로 설명한다.

신틸라 편집 콘트롤을 사용하는 법?

먼저, 신틸라 DLL을 다음과 같은 방법으로 적재한다:


	hmod = LoadLibrary("SciLexer.DLL");
		if (hmod==NULL)
		{
			MessageBox(hwndParent,
			"The Scintilla DLL could not be loaded.",
			"Error loading Scintilla",
			MB_OK | MB_ICONERROR);
		}
		

신틸라 DLL이 성공적으로 적재되면, 새로운 (물론, 스스로) 창 클래스를 등록한다. "Scintilla"라는 새로운 클래스가 새 신틸라 편집 콘트롤이다.

이제 이 새 콘트롤을 다른 윈도우즈 콘트롤처럼 똑같이 사용할 수 있다.


	hwndScintilla = CreateWindowEx(0,
		"Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,
		10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);
		

새 창 클래스 이름에 주목하자: "Scintilla". 이 시점에 이르면 실제로 Scintilla 편집 콘트롤이 윈도우즈 프로그램에 포함되어 있다.

신틸라 편집 콘트롤을 제어하는 법?

신틸라를 제어하려면 명령어를 편집 콘트롤에 보내면 된다. 두 가지 방법이 있다. 간단한 방법과 빠른 방법이 있다.

간단한 방법

간단한 방법은 다른 창 콘트롤과 마찬가지다. 메시지를 신틸라 편집 콘트롤에 보내고 그로부터 고지를 받을 수 있다. (고지는 신틸라 편집 콘트롤의 부모 창에 전송됨에 주의하자.)

신틸라 편집 콘트롤은 각 명령어에 대한 특별한 메시지를 알고 있다. 명령어를 신틸라 편집 콘트롤에 보내려면 SendMessage 함수를 사용하면 된다.


	SendMessage(hwndScintilla,sci_command,wparam,lparam);
			

다음과 같이:


	SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0);
			

명령어 중에는 값을 돌려주기도 한다. 사용되지 않는 매개변수는 NULL로 설정해야 한다.

빠른 방법

빠른 방법은 메시지 처리 함수를 직접 호출하는 것이다. 신틸라 편집 콘트롤의 메시지 처리 함수를 가리키는 포인터를 열람해서 직접 호출하여 명령어를 실행할 수 있다. 이 방법이 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);
			

"fn"을 신틸라 콘트롤의 메시지 처리 함수를 가리키는 함수 포인터로 하고 "ptr"을 첫 매개변수로 사용되어야 할 포인터로 한다. 다음에 오는 매개변수들은 두 개의 (선택적인) 매개변수를 가지는 Scintilla 명령어이다.

어떻게 고지를 받을까?

신틸라가 알려주기를 원하는 사건이 일어날 때마다, 신틸라 편집 콘트롤은 부모 창에게 고지를 보낸다. WM_NOTITY 메시지로 전송된다. 메시지를 받으면, xxx 구조를 들여다 보고 실제 메시지를 알아내야 한다.

그래서 신틸라의 부모창의 메시지 처리 함수에 다음과 같은 코드를 포함해야 한다:

	NMHDR *lpnmhdr;

	[...]

	case WM_NOTIFY:
		lpnmhdr = (LPNMHDR) lParam;

		if(lpnmhdr->hwndFrom==hwndScintilla)
		{
			switch(lpnmhdr->code)
			{
				case SCN_CHARADDED:
					/* 안녕, 신틸라가 방금 새문자가 */
					/* 편집 콘트롤에 추가되었다고 알려왔네.*/
					/* 이제 이 문자로 뭔가 멋진 일을 해야지. */
				break;
			}
		}
	break;
			

이 페이지는 홀거 슈미트(Holger Schmidt)가 공헌함.