You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.7 KiB
142 lines
4.7 KiB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> |
|
<html><head><meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"><title>How to use the Scintilla Edit Control in windows?</title></head><body bgcolor="#ffffff"> |
|
<p><h2>How to use the Scintilla Edit Control in windows?</h2> |
|
<p> |
|
This should be a little step by step explanation how to use Scintilla in the windows environment. |
|
</p> |
|
</p> |
|
<p><h2>How to create Scintilla Edit Control?</h2> |
|
<p> |
|
First of all, load the Scintilla DLL with something like: |
|
</p> |
|
<pre> |
|
|
|
hmod = LoadLibrary("SciLexer.DLL"); |
|
if (hmod==NULL) |
|
{ |
|
MessageBox(hwndParent, |
|
"The Scintilla DLL could not be loaded.", |
|
"Error loading Scintilla", |
|
MB_OK | MB_ICONERROR); |
|
} |
|
</pre> |
|
<p> |
|
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. |
|
</p> |
|
<p> |
|
Now you can use this new control just like any other windows control. |
|
</p> |
|
<pre> |
|
|
|
hwndScintilla = CreateWindowEx(0, |
|
"Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN, |
|
10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL); |
|
</pre> |
|
<p> |
|
Note the new window class name: "Scintilla". By reaching this point you actually included |
|
a Scintilla Edit Control to your windows program. |
|
</p> |
|
</p> |
|
<p><h2>How to control the Scintilla Edit Control?</h2> |
|
<p> |
|
You can control Scintilla by sending commands to the Edit Control. |
|
There a 2 ways of doing this. A simple and fast way. |
|
</p> |
|
<p><h3>The simple way to control Scintilla</h3> |
|
<p> |
|
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.) |
|
</p> |
|
<p> |
|
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. |
|
</p> |
|
<pre> |
|
|
|
SendMessage(hwndScintilla,sci_command,wparam,lparam); |
|
</pre> |
|
<p> |
|
like: |
|
</p> |
|
<pre> |
|
|
|
SendMessage(hwndScintilla,SCI_CREATEDOCUMENT, 0, 0); |
|
</pre> |
|
<p> |
|
Some of the commands will return a value and unused parameters should be set to NULL. |
|
</p> |
|
</p> |
|
<p><h3>The fast way to control Scintilla</h3> |
|
<p> |
|
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. |
|
</p> |
|
<p> |
|
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 :) |
|
</p> |
|
<p> |
|
The whole thing has to look like this: |
|
</p> |
|
<pre> |
|
|
|
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); |
|
</pre> |
|
<p> |
|
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. |
|
</p> |
|
|
|
</p> |
|
<p><h3>How will I receive notifications?</h3> |
|
<p> |
|
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. |
|
</p> |
|
<p> |
|
So in Scintillas parent window message handling function you have to include some code like this: |
|
</p> |
|
<pre> |
|
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; |
|
</pre> |
|
</p> |
|
</p> |
|
|
|
<p> |
|
<i>Page contributed by Holger Schmidt.</i> |
|
</p> |
|
</body></html> |
|
|
|
|