Po raz kolejny próbuję wykorzystać edytor Scintilla, tym razem za pomocą biblioteki SciLexer.dll, zgodnie z opisem ze strony:
https://www.scintilla.org/Steps.html
DLL-ka oraz plik nagłówkowy tutaj:
https://www.mpsoft.pl/usun/Scintilla/SciLexer.dll
https://www.mpsoft.pl/usun/Scintilla/Scintilla.h
Na głównym Form1 mam dwa panele. Na Panel1 jest parę przycisków, na Panel2 umieszczam edytor Scintilla.
Trochę kodu:
KOD cpp: UKRYJ
//---------------------------------------------------------------------------
// Unit1.h
#include "include\Scintilla.h"
[...]
private:
// SciLexer.dll
HINSTANCE dllhandle;
HWND hSciWnd;
//---------------------------------------------------------------------------
// Unit1.cpp
// Wczytaj biblioteke 'SciLexer.dll'
dllhandle = LoadLibrary(L"SciLexer.dll");
if ( dllhandle )
{
HWND hwndParent = Panel2->Handle;
hSciWnd = CreateWindowEx( 0,
L"Scintilla",
L"",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
0,0,500,400,
Panel2->Handle,
NULL, NULL, NULL );
}
// Unit1.h
#include "include\Scintilla.h"
[...]
private:
// SciLexer.dll
HINSTANCE dllhandle;
HWND hSciWnd;
//---------------------------------------------------------------------------
// Unit1.cpp
// Wczytaj biblioteke 'SciLexer.dll'
dllhandle = LoadLibrary(L"SciLexer.dll");
if ( dllhandle )
{
HWND hwndParent = Panel2->Handle;
hSciWnd = CreateWindowEx( 0,
L"Scintilla",
L"",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
0,0,500,400,
Panel2->Handle,
NULL, NULL, NULL );
}
Edytor Scintilla tworzy się prawidłowo (chyba), mogę na nim pisać, zaznaczać, działają klawisze Home, End, PageUp, PageDown itp. Poprawnie działają też funkcje Scintillii które wywołuję za pomocą SendMessage.
Ale...
Jeśli wcisnę klawisze strzałek, to tracę focus z edytora (a tak naprawdę focus przeskakuje z Panel2 do Panel1), co powoduje, że znika kursor tekstowy i nie można dalej pisać.
Scintilla ma dwie funkcje które teoretycznie powodują złapanie focusa (SCI_SETFOCUS oraz SCI_GRABFOCUS https://www.scintilla.org/ScintillaDoc. ... I_SETFOCUS )
jednak ani jedno ani drugie nie daje zadowalającego efektu.
Wykonanie takiego kodu...
KOD cpp: UKRYJ
Panel2->SetFocus();
SendMessage(hSciWnd, SCI_SETFOCUS, 1, 0);
SendMessage(hSciWnd, SCI_GRABFOCUS, 0, 0);
SendMessage(hSciWnd, SCI_SETFOCUS, 1, 0);
SendMessage(hSciWnd, SCI_GRABFOCUS, 0, 0);
... umożliwia pisanie po edytorze, ale tak naprawdę focus jest na Panel2, ActiveControl wskazuje Panel2, a wciśnięcie dowolnego klawisz strzałki przenosi pomiędzy panelami i pisanie się kończy :/
Funkcje SetForegroundWindow lub ShowWindow wykonane dla 'hSciWnd' też nic nie daje.
CreateWindowEx z podanym NULL zamiast Panel2->Handle, tworzy oddzielne okno i wtedy problem nie występuje, no ale oczywiście chciałbym mieć edytor na Form1 a nie w oddzielnym oknie.
Da się jakoś zmusić tak utworzony Edytor do złapania focusa? A może ktoś ma lepszy pomysł na położenie Scintillii na Form-ie?