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

Scintilla, CreateWindowEx

problemy z funkcjonowaniem bibliotek, komponentów itp.

Scintilla, CreateWindowEx

Nowy postprzez Mironas » poniedziałek, 25 stycznia 2021, 19:46

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?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 492
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Scintilla, CreateWindowEx

Nowy postprzez polymorphism » wtorek, 26 stycznia 2021, 11:43

Próbowałeś bez WS_TABSTOP?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Scintilla, CreateWindowEx

Nowy postprzez Mironas » wtorek, 26 stycznia 2021, 12:04

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 492
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Scintilla, CreateWindowEx

Nowy postprzez polymorphism » wtorek, 26 stycznia 2021, 13:58

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Scintilla, CreateWindowEx

Nowy postprzez Mironas » wtorek, 26 stycznia 2021, 15:12

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. :/
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 492
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Scintilla, CreateWindowEx

Nowy postprzez polymorphism » wtorek, 26 stycznia 2021, 19:50

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).
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Mironas
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Scintilla, CreateWindowEx

Nowy postprzez Mironas » środa, 27 stycznia 2021, 10:34

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 :)
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 492
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron