From 664e37abfe5c796c1279b8295fb030f126b0a7d8 Mon Sep 17 00:00:00 2001
From: Timothy Pearson
+ This should be a little step by step explanation how to use Scintilla in the windows environment.
+ How to use the Scintilla Edit Control in windows?
+
+ 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. +
+ + -- cgit v1.2.1