This should be a little step by step explanation how to use Scintilla in the windows environment.
First of all, load the Scintilla DLL with something like:
hmod = LoadLibrary("SciLexer.DLL"); if (hmod==NULL) { MessageBox(hwndParent, "The Scintilla DLL could not be loaded.", "Error loading Scintilla", MB_OK | MB_ICONERROR); }
If the DLL was loaded successfully, then the DLL has registered (yes, by itself) a new window class. The new class called "Scintilla" is the new scintilla edit control.
Now you can use this new control just like any other windows control.
hwndScintilla = CreateWindowEx(0, "Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN, 10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);
Note the new window class name: "Scintilla". By reaching this point you actually included a Scintilla Edit Control to your windows program.
You can control Scintilla by sending commands to the Edit Control. There a 2 ways of doing this. A simple and fast way.
The simple way is just like with any other windows control. You can send messages to the Scintilla Edit Control and receive notifications from the control. (Note that the notifications are sent to the parent window of the Scintilla Edit Control.)
The Scintilla Edit Control knows a special message for each command. To send commands to the Scintilla Edit Control you can use the SendMessage function.
SendMessage(hwndScintilla,sci_command,wparam,lparam);
like:
SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0);
Some of the commands will return a value and unused parameters should be set to NULL.
The fast way of controlling the Scintilla Edit Control is to call message handling function by yourself. You can retrieve a pointer to the message handling function of the Scintilla Edit Control and call it directly to execute a command. This way is much more faster than the SendMessage() way.
1st you have to use the SCI_GETDIRECTFUNCTION and SCI_GETDIRECTPOINTER commands to retrieve the pointer to the function and a pointer which must be the first parameter when calling the retrieved function pointer. You have to do this with the SendMessage way :)
The whole thing has to look like this:
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);
with "fn" as the function pointer to the message handling function of the Scintilla Control and "ptr" as the pointer that must be used as 1st parameter. The next parameters are the Scintilla Command with its two (optional) parameters.
Whenever an event occurs where Scintilla wants to inform you about something, the Scintilla Edit Control will send notification to the parent window. This is done by a WM_NOTITY message. When receiving that message, you have to look in the xxx struct for the actual message.
So in Scintillas parent window message handling function you have to include some code like this:
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;
Page contributed by Holger Schmidt.