CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Scintilla, CreateWindowEx
Strona 1 z 1

Scintilla, CreateWindowEx

Nowy postNapisane: poniedziałek, 25 stycznia 2021, 19:46
przez Mironas
Hej,

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 );
  }
 


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);
 

... 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?

Re: Scintilla, CreateWindowEx

Nowy postNapisane: wtorek, 26 stycznia 2021, 11:43
przez polymorphism
Próbowałeś bez WS_TABSTOP?

Re: Scintilla, CreateWindowEx

Nowy postNapisane: wtorek, 26 stycznia 2021, 12:04
przez Mironas
polymorphism napisał(a):Próbowałeś bez WS_TABSTOP?

Tak, kombinowałem z różnymi ustawieniami. Bez efektu.

Jak tworzę Edytor na pustym oknie (TForm), albo na formie jest tylko jeden panel na którym jest edytor, to działa ok. Jeśli są tam inne komponenty, to strzałki zamiast przesuwać kursor tekstowy edytora, przesuwają focus na te komponenty.

Próbowałem też obsłużyć OnKeyDown i OnKeyPres głównej formy (przy włączonym KeyPreview), ale jak piszę po edytorze, to te zdarzenia nie są wywoływane.

Re: Scintilla, CreateWindowEx

Nowy postNapisane: wtorek, 26 stycznia 2021, 13:58
przez polymorphism
Nie są wywoływane, bo zdarzenia ustawiałeś dla głównej formy, a nie dla edytora.

Popróbuj też z właściwością TabStop dla formy.

Re: Scintilla, CreateWindowEx

Nowy postNapisane: wtorek, 26 stycznia 2021, 15:12
przez Mironas
polymorphism napisał(a):Popróbuj też z właściwością TabStop dla formy.


Nie wiedziałem, że TForm ma TabStop, bo w inspektorze obiektów nie ma tej właściwości, ale faktycznie ma.
Niestety po zmianie TabStop na true w kreatorze formy, nadal nie działa. :/

Re: Scintilla, CreateWindowEx

Nowy postNapisane: wtorek, 26 stycznia 2021, 19:50
przez polymorphism
Z tego, co wyczytałem w internetach, przełączanie focusów strzałkami jest możliwe w ramach grupy okien. Najwidoczniej edytor jest w tej samej grupie co reszta kontrolek i dlatego jest, jak jest. Dodaj WS_GROUP, by edytor był w innej grupie (sprawdź z WS_TABSTOP i bez).

Re: Scintilla, CreateWindowEx

Nowy postNapisane: środa, 27 stycznia 2021, 10:34
przez Mironas
polymorphism napisał(a):Dodaj WS_GROUP, by edytor był w innej grupie

Już myślałem, ze zadziałało a tu nagle przestało działać. Zacząłem szukać przyczyny i okazało się, że niezależnie od WS_GROUP i innych styli okna działa gdy ActiveControl formy jest NULL. Na szczęście można go ustawiać ręcznie.

Problem rozwiązany :)