Kolorowanie PageControl w Lazarusie

Odpowiedz Nowy wątek
2015-01-14 21:31
0

Witam,

Jest jakiś sposób aby zakładki PageControl miały kolor taki jak okno? Po wstawieniu na formularz są białe włącznie z przyciskami którymi się przełącza zakładki, co niezbyt ładnie wygląda. W necie można znaleźć jakiś kod który niby to umożliwia, ale mi to nie zadziałało. Pozostaje albo inny komponent który umożliwia większą konfigurację, albo np. dodawanie Panelu do każdej zakładki TabSheet i umieszczanie reszty na nim. Tyle że to też nie wygląda tak jak powinno. No chyba że ktoś zna prostą metodę żeby pokolorować PageControl. Najlepiej z jakimś przykładem kodu.

Dołącz do tego posta zrzut ekranu, bo domyślnie użwany jest wygląd taki jak w bieżącym schemacie w systemie; Obstawiam, że masz Win8, ale dobrze by było to zobaczyć; - furious programming 2015-01-14 21:50
Po prostu aktywna zakładka cała ma białe tło. Nie ma sensu robić zrzutu. Wiem że ogólnie jest z tym problem. Ktoś pisał, że mu się tak robiło jak miał włączone style w XP. Ja mam Windows 7. - szod 2015-01-14 22:40

Pozostało 580 znaków

2015-01-14 22:11
0

Rozumiem, że klasa dziedzicząca po ComCtrls.TTabSheet z własną obsługą WM_ERASEBKGND nie sprawdza się pod Lazarusem? Bo pod Delphi wystarcza. Z tym, że dla Delphi 7, a może i nie tylko, należy użyć dodatkowego modułu, który jakby patchuje wywołanie funkcji API czy tam obsługę komunikatów. Ponieważ inaczej są niestety zakładki rysowane bez własnych etykiet i wygląd nie jest do końca prawidlowy. Ma to miejsce chyba tylko na 64 bitowych systemach.

Moduł ten mam pod nazwą vclfixes i znalazłem go w Google. Ideą jego jest krótko opisana w komentarzu na początku kodu // WMDrawItem fails under WOW64, see http://qc.codegear.com/wc/qcmain.aspx?d=19859. Poniżej screeny jak wygląda program z modułem i bez niego. Program był pisany dla jednego znajomka. Obecnie nie rozwijam już tego kodu. Ale właśnie malowanie PageControl jest zrobione przez nadpisanie obsługi wspomnianego na początku komunikatu.

Schowek01.png

Schowek02.png

EDIT: teraz o ile dobrze widzę, to TPageControl nie ma pod Lazarusem w ogóle zdarzenia OnDrawTab. Tutaj może coś doradzi @furious programming, bo ja Lazarusa używam od święta i nie znam dobrze tego IDE oraz LCL.


edytowany 4x, ostatnio: olesio, 2015-01-14 22:31

Pozostało 580 znaków

2015-01-14 22:44
0
olesio napisał(a):

Rozumiem, że klasa dziedzicząca po ComCtrls.TTabSheet z własną obsługą WM_ERASEBKGND nie sprawdza się pod Lazarusem?

Tak, to ten sam fragment kodu. Trochę to dla mnie zamotane ;) Chyba lepiej pokombinuję coś po swojemu, albo poszukam lepszego komponentu. Albo zainstaluję wiekowe Delphi 2005 i problem się rozwiąże ;)

edytowany 1x, ostatnio: szod, 2015-01-14 22:47

Pozostało 580 znaków

2015-01-14 23:00
0

Kiedyś dużo bawiłem się w implementowanie własnego malowania, ale miałem do dyspozycji jedynie to, co VCL z Delphi7 pozwalało mi pomalować (odpowiednie zdarzenia), bez różnych kombinacji w hooki itp.; Jednak PageControl nigdy nie potrzebowałem malować po swojemu, więc tutaj niewiele doradzę;

Spróbuj zaimplementować trick opisany w tym artykule, czyli stworzyć nową klasę zakładki, dziedzicząc po TTabSheet i nadpisać metodę obsługującą komunikat WM_ERASEBKGND (w Lazarusie jest to stała LM_ERASEBKGND z modułu LMessages); Reszta jest opisana także w tym samym artykule, a efekt działania nowej klasy zakładki masz na samym jego dole.


edytowany 2x, ostatnio: furious programming, 2015-01-14 23:01

Pozostało 580 znaków

2015-01-15 17:09
0

Trochę to jednak dla mnie za skomplikowane. Próba wykorzystania kodu kończy się problemami których rozwiązanie jest dla mnie obecnie zbyt trudne. Jak coś uda mi się poprawić to pojawia się kolejny błąd. W Delphi był fajny komponent, można było zmieniać nawet styl przycisków przełączających. Jedną z możliwych opcji jest zrobienie takiego pseudo PageControl - zwykłe przyciski i przełączane panele. Tylko tutaj znów będzie problem na etapie wizualnego rozmieszczania kontrolek, bo panele się zasłaniają. Trzeba je przerzucać na wierzch w inspektorze obiektów.

Pozostało 580 znaków

2015-01-15 17:24
0

Próba wykorzystania kodu kończy się problemami których rozwiązanie jest dla mnie obecnie zbyt trudne. Jak coś uda mi się poprawić to pojawia się kolejny błąd.

Najpierw trzeba się zapoznać z wnętrzem klasy danego komponentu i zrozumieć co się w nim dzieje, aby móc cokolwiek zmodyfikować; Bez tej wiedzy, zmodyfikowanie klasy prowadzi do mnożenia się kolejnych błędów - i tak praktycznie bez końca; Dlatego sam wolę pisać komponenty zupełnie od podstaw;

W Delphi był fajny komponent, można było zmieniać nawet styl przycisków przełączających.

No widzisz - ktoś taki komponent albo napisał sam, albo był na tyle cierpliwy, że stworzył go na podstawie istniejących klas z VCL; Samo się nie zrobi - coś trzeba samemu napisać;

Jedną z możliwych opcji jest zrobienie takiego pseudo PageControl - zwykłe przyciski i przełączane panele. Tylko tutaj znów będzie problem na etapie wizualnego rozmieszczania kontrolek, bo panele się zasłaniają. Trzeba je przerzucać na wierzch w inspektorze obiektów.

To akurat jest najmniejszy problem, bo komponenty w edytorze formularzy układasz raz, a program już później korzysta z wybranego ułożenia; Pamiętaj tylko, że zbudowanie pseudo-PageControl z przycisków i paneli nie będzie miało takiej funkcjonalności, jak oryginalny komponent z zakładkami - wszystko będziesz musiał implementować sam, na dodatek w klasie formularza; Ale jakieś to rozwiązanie jest - użytkownik i tak nie będzie miał pojęcia o tym, jak program został zbudowany.


edytowany 1x, ostatnio: furious programming, 2015-01-15 17:24

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0