From a69b55c674b0528c00598bea54b7a661f4e49f27 Mon Sep 17 00:00:00 2001
From: gregory guy
- 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.3