Komponent TSkiner
Borland C++ Builder v6.
Poprawki: 2 sierpnia 2006
Poprawiono błędy w działaniu komponentu. Większość błędów pojawiała się podczas korzystania z komponentu w środowisku innym niż Windows XP.
poprawiono błąd w Windows 9.x/ME pojawiający się przy klikaniu w pasek przesuwania komponentu (komunikat błędu: Stack overflow),
zmieniono sposób zamykania okna z komponentem po kliknięciu na przycisku zamykania. Zastąpiono polecenie Application->Terminate(), poleceniem Close(). Teraz po kliknięciu na przycisku zamknięcia zamyka się okno programu, a nie aplikacja, jeżeli jest to okno główne programu to nastąpi zamknięcie aplikacji,
poprawiono błąd z ustawianiem właściwości TransparentColor, wcześniej ustawienie właściwości na false, nie zmieniało tak naprawdę nic i komponent wciąż stosował przeźroczystość.
Jeżeli już
zainstalowałeś komponent w swoim środowisku BCB, to nie musisz go instalować
ponownie wystarczy, że ściągniesz
stąd tylko pliki do aktualizacji. Po
pobraniu wypakuj archiwum, będą w nim cztery pliki: skiner.cpp,
skiner.h, skiner.obj i skiner.res, należy nimi zastąpić stare
pliki. Następnie należy zamknąć w BCB otwarte pliki i projekty poprze menu File
| Close All, następnie w menu Project | Options wybieramy z zakładki Packages,
paczkę której użyliśmy do instalacji komponentu. Wybieramy przycisk Edit,
wyskoczy komunikat więc klikamy na przycisku Yes, powinno pojawić się okno w
którym wybieramy przycisk Compile.
Po skompilowaniu zamykamy wszystko, nie instalujemy ponownie paczki ponieważ
jest ona już zainstalowana. Restartujemy BCB.
W projektach, w których wykorzystujemy ten komponent, należy jednorazowo wybrać
przez poleceniem Run polecenie Build w celu rekompilacji całego projektu łącznie
ze zaktualizowanym projektem, w przeciwnym razie projekt może nie zawierać
zaktualizowanego komponentu, tylko jego wcześniejszą wersję.
Wstęp.
Komponent TSkiner został napisany w środowisku Borland C++ Builder w wersji 6.0. Ponieważ komponent wykorzystuje biblioteki z tego środowiska, mogą wystąpić problemy z użytkowaniem komponentu we wcześniejszych wersjach BCB. Komponent z całą pewnością nie będzie działał prawidłowo w środowisku BCB 4 i wcześniejszych.
Zastosowanie.
Komponent TSkiner służy do nakładania na okno formularza maski lub jeśli ktoś woli skórki. Skórka składa się z elementów od 1 do 12. Komponent obsługuje tylko plik w formacie *.BMP, obsługuje przeźroczystość bitmap jak również przeźroczystość formularza, dzięki temu możliwe jest tworzenie formularza wyposażonego w skórki o dowolnym kształcie. Został on stworzony w taki sposób, żeby obsługiwać minimalizację, maksymalizację i zamykanie formularza, za pośrednictwem własnych (zdefiniowanych przez użytkownika) ikonek. Dokładny opis zastosowania i użytkowania komponentu znajduje się w dalszej części artykułu.
Instalacja komponentu.
Pobierz komponent
TSkiner - 1.0 MB (zawiera juz poprawki z 2 sierpnia 2006r.)
W archiwum razem z komponentem znajduje się wersja demonstracyjna programu
napisana w BCB 6, przedstawiająca kilka możliwości programu. Przed uruchomieniem
projektu trzeba zainstalować komponent. Należy rozpakować archiwum do wybranego
folderu, przy czym nazwa folderu i wszystkich podfolderów powinna składać się z
pojedynczego wyrazu. Po wypakowaniu trzeba odszukać paczkę Skinpak.bpk,
wystarczy więc po uruchomieniu środowiska BCB zamknąć otwarty projekt poprzez
menu File | Close ALL, a następnie poprzez menu File | Open Project...
odszukujemy plik Skinpak.bpk. W oknie które się otworzy należy nacisnąć
przycisk Complile, po skompilowaniu paczki naciskamy przycisk Install,
jeśli wszystko zostało zrobione prawidłowo, komponent powinien się zainstalować
na nowo utworzonej palecie Cyfbar. Teraz wystarczy tylko zrestartować
BCB.
Może się zdarzyć, że paczka dołączona do komponentu
TSkiner, nie będzie chciała się skompilować i będą zgłaszane komunikaty o
brakujących bibliotekach. W takiej sytuacji trzeba utworzyć własną paczkę. W
menu File wybieramy New a następnie Other... W oknie, które
wyskoczy wybieramy Package. Wyskoczy okno tworzenia nowej paczki.
Zapisujemy paczkę pod nową nazwą (tylko znaki języka angielskiego i
jednoczłonowa nazwa paczki) w katalogu z komponentem TSkiner, w tym samym
oknie naciskamy przycisk Add, a następnie w nowo otwartym oknie naciskamy
przycisk Browse i odszukujemy plik komponentu Skiner.cpp. Gdy plik
komponentu zostanie dołączony do paczki, kompilujemy paczkę. Teraz nie powinno
być już z tym żadnych problemów, po skompilowaniu instalujemy paczkę.
Jeżeli masz problemy z instalacją komponentów napisz. Opisz problem bardzo dokładnie, podając wszystkie komunikaty zgłaszane przez kompilator.
Opis właściwości komponentu.
Po zainstalowaniu paczki proponuję otworzyć dołączony do programu projekt demonstracyjnej wersji programu wykorzystującej komponent TSkiner. Proponuję przyjrzeć się równiez zawartości katalogu z projektem. Znajdują się tam dwa podkatalogi: pak2 i pictures. W katalogu pak2 znajdują się bitmapy stanowiące całość skórki nakładanej na formularz. Nazwa katalogu jest dowolna, jednak nazwy poszczególnych bitmap muszą być dokładnie takie jak podano, czyli:
background.bmp - bitmapa będąca tłem skórki, wypełnia cała pustą przestrzeń komponentu,
centerdown.bmp - bitmapa rysowana centralnie na dole komponentu,
centerleft.bmp - bitmapa rysowana centralnie z lewej strony komponentu,
centerright.bmp - bitmapa rysowana centralnie z prawej strony komponentu,
centertop.bmp - bitmapa rysowana centralnie u góry komponentu,
leftdown.bmp - bitmapa rysowana w lewym dolnym rogu komponentu,
lefttop.bmp - bitmapa rysowana w lewym górnym rogu komponentu,
rightdown.bmp - bitmapa rysowana w prawym dolnym rogu komponentu,
righttop.bmp - bitmapa rysowana w prawym górnym rogu komponentu,
close.bmp - bitmapa zawierająca przyciski zamykania programu,
minimize.bmp - bitmapa zawierająca przyciski minimalizacji programu,
maximize.bmp - bitmapa zawierająca przyciski maksymalizacji programu.
Bitmapy obsługują przeźroczystość, kolorem przeźroczystym jest kolor zdefiniowany we właściwości TransparentColorValue komponentu TSkiner (nie mylić z właściwością TransparentColorValue formularza). Przeźroczystość elementów skórki włącza się poprzez ustawienie właściwości komponentu TransparentColor na true. Zasadę stosowania poszczególnych bitmap najlepiej obrazują zmieszczone poniżej rysunki:
|
rys. 1 |
|
rys. 2 |
Rysunek 1
przedstawia poszczególne elementy skórki, natomiast rysunek 2 przedstawia gotową
już skórkę po skompilowaniu i uruchomieniu programu.
Właściwość DirImage.
Właściwość DirImage komponentu pobiera nazwę katalogu z którego wczytywane są bitmapy do tworzenia skórki. Jeżeli katalog ze skórkami znajduje się w tym samym katalogu co program można podawać tylko nazwę katalogu, jednak pewne działania wykonywane przez program mogą sprawić, że nie będzie on w stanie odnaleźć katalogu ze skórkami jeśli właściwość DirImage będzie zawierała względną ścieżkę dostępu do katalogu ze skórkami, dlatego najlepiej jest podawać ścieżkę bezwzględną. Określenie ścieżki bezwzględnej bezpośrednio w Inspektorze Obiektów na zakładce Properties nie jest dobrym pomysłem, jeśli chcemy zdefiniować ścieżkę względem programu, będzie to działało prawidłowo, dopóki program nie zmieni swojej lokalizacji czyli nie zostanie przeniesiony na inny dysk. Dlatego na etapie programowania, żeby skórka była widoczna należy podać tylko nazwę katalogu w którym znajdują się skórki, ale tylko wtedy jeśli katalog ze skórkami znajduje się w katalogu programu, dobrze jest jednak zdefiniować również do tego katalogu ścieżkę bezwzględną, względem programu, np. w zdarzeniu OnShow dla formularza na którym znajduje się skórka:
void
__fastcall TForm1::FormShow(TObject *Sender)
{
Skiner1->DirImage = ExtractFilePath(ParamStr(0)) + "pak2";
}
W trakcie działania programu można zmieniać dowolnie skórki poprzez zmianę właściwości DirImage, należy po prostu podawać nazwę katalogu w którym znajduje się skórka, którą chcemy załadować. W katalogu oprócz bitmap wchodzących w skład skórki można umieścić również plik skin.ini zawierający ustawienie dla niektórych właściwości komponentu. Nazwa pliku jest niezmienne, komponent nie wczyta zawartości pliku dopóki nie zostanie wywołana funkcja LoadPositionFromIni(). Funkcję należy wywołać przed zmianą właściwości DirImage. Jeżeli wywołamy funkcję, a w podanym katalogu nie będzie pliku skin.ini, to komponent zachowa swoje zdefiniowane właściwości w Inspektorze Obiektów. Plik skin.ini ma następującą konstrukcję:
[SKIN]
CAPTION_HEIGHT=ustawia właściwość komponentu Caption_Height
CAPTION_HPOS=ustawia właściwość komponentu Caption_Hpos
CAPTION_VPOS=ustawia właściwość komponentu Caption_Vpos
STABLEHEIGHT=ustawia właściwość komponentu StableHeight
STABLEWIDTH=ustawia właściwość komponentu StableWidth
ICONLEFT=ustawia właściwość komponentu LeftIcon
ICONTOP=ustawia właściwość komponentu TopIcon
LOCKSIZE=ustawia właściwość komponentu LockSize
IMGCLOSEPOS_RIGHT=ustawia właściwość komponentu ImgClosePos->Right
IMGCLOSEPOS_TOP=ustawia właściwość komponentu ImgClosePos->Top
IMGMAXIMIZEPOS_RIGHT=ustawia właściwość komponentu ImgMaximizePos->Right
IMGMAXIMIZEPOS_TOP=ustawia właściwość komponentu ImgMaximizePos->Top
IMGMINIMIZEPOS_RIGHT=ustawia właściwość komponentu ImgMinimizePos->Right
IMGMINIMIZEPOS_TOP=ustawia właściwość komponentu ImgMinimizePos->Top
Tworząc plik
skin.ini należy ustawiać wszystkie jego właściwości, nic nie może być pominięte,
w przeciwnym razie komponent dla pominiętych właściwości przyjmie wartość 0.
Przykładowy plik skin.ini.
Przykład zmiany katalogu z plikami skórki i z funkcją wczytania właściwości,
dodatkowo w przykładzie zostanie wywołana funkcja SkinRepaint() przerysowująca
skórkę. Stosowanie funkcji SkinRepaint() nie jest w zasadzie konieczne, ponieważ
przerysowanie komponentu jest wywoływane automatycznie, funkcja SkinRepaint()
wywołuje jednak odświeżenie nowo wczytanej skórki, więc może być pomocne przy
zmianie skórki w trakcie działania programu:
void
__fastcall TForm1::Button1Click(TObject *Sender)
{
Skiner1->LoadPositionFromIni();
Skiner1->DirImage = ExtractFilePath(ParamStr(0)) + "skin1";
Skiner1->SkinRepaint();
}
Na szczególna uwagę zasługuje konstrukcja bitmap close.bmp, minimize.bmp i maximize.bmp. Te bitmapy zawierają komplet przycisków reagujących animacją na wskazania ich myszką, Oznacza to że jeśli np. najedziemy myszką na ikonę maksymalizacji to zmieni o na wygląd, jeśli naciśniemy tą ikonę to również zmieni ona wygląd. Bitmapy close.bmp i minimize.bmp mają taką samą konstrukcję, składają się z trzech rysunków, pierwszy jest aktywowany gdy wskaźnik myszy znajduje się w neutralnej pozycji, czyli gdy nie wskazuje ikony, drugi jest aktywowany gdy ikona zostanie wskazana myszą, trzeci jest aktywowany gdy zostanie wciśnięty klawisz myszy. Przedstawiony niżej rysunek (w powiększeniu) pokazuje jak należy konstruować bitmapy close.bmp i minimize.bmp:
Bitmapa maximize.bmp ma podobną konstrukcję, składa się jednak z sześciu rysunków, przyciski 1 i 2 są aktywowane w pozycji neutralnej, przyciski 3 i 4 po wskazaniu myszą, a przyciski 5 i 6 po wciśnięciu klawisza myszy do dołu.
Bitmapy przycisków mogą mieć dowolną wysokość, jednak szerokość bitmap musi być wielokrotnością liczby przycisków, czyli np. jeśli przycisk close ma długość 11 pikseli to bitmapa close.bmp powinna mieć długość 3x11 pikseli = 33 piksele. W przypadku bitmapy maximize.bmp jej długość jest wielokrotnością sześciu przycisków. Pozycja wymienionych przycisków na komponencie Skiner jest określana poprzez właściwości (patrz Inspektor Obiektów) ImgClosePos dla close.bmp (właściwości Right i Left), ImgMinimizePos (Right i LEft) dla minimize.bmp, właściwość ImgMaximizePos (Right i Left) dla maximize.bmp. Przyciski są wyrównywane do prawego górnego rogu, stąd właściwość Right a nie Left. Wyrównanie do prawej strony sprawia, że przy zmianie rozmiaru formularza, zmienia się również położenie tych przycisków.
Dotychczas omawiany był przykład wczytywania skórki z plików umieszczanych na dysku. Takie rozwiązanie jest dobre jeśli chcemy stworzyć program z możliwością zmiany skórek, jednak wymaga ono dołączania zawsze do programu katalogu z bitmapami składającymi się na skórki. Można jednak umieścić w komponencie skórki na stałe, służy do tego właściwość PicImage na którą składają się jeszcze poszczególne właściwości umożliwiające wczytanie do programu bitmap z elementami skórki. Tak załadowane skórki zostaną skompilowane razem z programem. Nazwy poszczególnych właściwości określają jaki element bitmapy ma być wczytany do danej właściwości, i tak np. właściwość LeftDown mówi nam, że należy wczytać lewy dolny róg skórki. Nazwy plików czytywanych do tych właściwości mogą mieć dowolną nazwę, jednak muszą to być bitmapy. Użycie skórki wczytanej do komponentu jest opcjonalne, oznacz to że wciąż można używać zarówno skórek wczytywanych z dysku jak i tych umieszczonych w programie. Dla przycisków wczytanych do komponentu pozycja określana jest poprzez właściwości PicClosePos, PicMinimizePos i PicMaximizePos. Zasada tworzenia poszczególnych elementów składających się na skórkę umieszczaną w programie jest taka sam jak na skórkę wczytywaną z dysku. Zmiana typu aktualnie używanej skórki następuje poprzez zmianę właściwości TypeSkin. Jeżeli skórka zostanie umieszczona w programie to nie ma potrzeby rozprowadzania poszczególnych jej elementów razem z programem, ponieważ są one wczytywane bezpośrednio z zasobów programu.
Tworząc skórkę nie trzeba tworzyć wszystkich jej elementów, jeżeli jakiś element zostanie pominięty, to nie będzie po prostu odrysowany. Do zbudowania statycznej skórki wystarczy właściwie tylko element LEftTop.bmp. Więcej o tym w dalszej części artykułu.
Właściwość TypeSkin.
Właściwość TypeSkin określa czy ma być użyta skórka wczytywana z dysku, czy też ta znajdująca się w zasobach programu. Ustawienie tej właściwości na tsFile wymusza ładowanie skórki z katalogu na dysku, tsPicture wymusza ładowanie skórki umieszczonej w programie. Ustawienie tsNone wyłącza skórki.
Właściwości TransparentColor i TransparentColorValue.
Właściwość
TransparentColorValue określa który kolor w bitmapach będzie określony
jako przeźroczysty. W podanych wyżej przykładach takim kolorem przeźroczystym
jest jasno zielony, a konkretnie w przykładzie clLime.
Właściwość TransparentColor określa czy przeźroczystość ma być stosowana.
Wartość true włącza przeźroczystość, false ją wyłącza.
Wymienione właściwości sterują tylko przeźroczystością komponentu TSkiner, nie
wpływają w żaden sposób na przeźroczystość formularza. Tworząc skórkę, możemy ją
tworzyć o dowolnym kształcie, np. rogi mogą być zaokrąglone, jak w przykładzie
bitmapy LeftTop.bmp i RighTop.bmp, niże przykład tych bitmap w powiększeniu:
Jak widać na rysunku oprócz koloru przeźroczystego dla komponentu TSkiner (w przykładzie clLime), użyto na rogach również koloru czerwonego (w przykładzie clRed) jako tego, który będzie kolorem przeźroczystym dla formularza. Przy tak skonstruowanych bitmapach należy zrobić jeszcze jedną rzecz, otóż właściwość TransparentColorValue formularza należy ustawić na clRed, a właściwość TransparentColor na true. Przy takich ustawieniach komponent TSkiner będzie zawsze usuwał kolor clLime, a formularz uczyni przeźroczystym wszystko co będzie na nim czerwone i dotyczy to nie tylko grafiki ale wszelkiego rodzaju komponentów umieszczonych na formularzu jak również samego formularza. Właściwość TransparentColorValue komponentu TSkiner musi być inna niż właściwość TransparentColorValue formularza na którym ten komponent się znajduje. Jako przeźroczyste można określać dowolne kolory. Przeźroczystość komponentu TSkiner jest ustawiana dla wszystkich jego elementów, więc dotyczy nie tylko bitmap wczytywanych z dysku ale również tych umieszczonych w zasobach programu, dotyczy ona również przycisków.
Właściwość BackgroundSyle.
Ta właściwość określa w jaki sposób będzie odrysowywana bitmapa tła skórki i odnosi się to zarówno do pliku skórki background.bmp wczytywanego z dysku jak również dla właściwości PicImage->Background przechowującej tło skórki w zasobach programu. Ustawienie bsFill wypełnia skórkę tłem sąsiadująco, bsDraw rysuje tło wyznaczając jako punkt początkowy parametry X = 0 i Y = 0. Ustawienie bsGradient nie używa pliku tła lecz zamiast tego rysuje tło gradientowe.
Właściwość Gradient.
Ta właściwość określa kolor rysowanego gradientu przy właściwości BackgroundStyle ustawionej na bsGradient. Sposób rysowania gradientu jest sztywno określony w komponencie i jedyne co można tutaj zmienić to tylko kolor początkowy gradientu, reszta jest dobierana automatycznie.
Właściwości Caption, Caption_Height, Caption_Hpos, Caption_Vpos.
Właściwość
Caption określa treść tekstu wyświetlanego u góry komponentu.
Właściwość Caption_Hpos określa położenie tekstu (właściwość Caption) w
odniesieniu do lewej strony.
Właściwość Caption_Vpos określa położenie tekstu (właściwość Caption) w
odniesieniu do góry komponentu.
Właściwość Caption_Height określa wysokość belki za którą można uchwycić w celu
przeciągnięcia okna programu. Szerokość belki określa również pozycję w jakiej
zostanie wyrysowany tekst (właściwość Caption) Belka nie jest odrysowywana, to
tylko wartość liczbowa przechowywana w pamięci.
Właściwości Icon, IconLeft, IconTop.
Właściwość Icon
umieszcza w programie ikonę, która jest odrysowywana w lewym górnym rogu
komponentu TSkiner.
Właściwość IconLeft określa pozycję ikony od lewej strony komponentu.
Właściwość IconTop określa pozycję ikony od góry komponentu.
Właściwości ImgClosePos, ImgMaximizePos, ImgMinimizePos.
Te właściwości określają położenie przycisków Close, Minimize i Maximize na komponencie, Przyciski są wyrównywane do prawego górnego rogu komponentu. Więcej o tym czytaj w punkcie Właściwość DirImage tego artykułu.
Właściwość LockSizes.
Właściwość określa czy można dokonywać zmiany rozmiaru formularza poprzez przeciągnięcie za lewy dolny róg. Ustawienie true blokuje możliwość zmiany rozmiaru formularza i maksymalizacji, wyłącza również wyświetlanie ikony maksymalizacji.
Właściwość PicImage.
Ta właściwość pozwala na umieszczenie w zasobach programu bitmap składających się na skórkę. Więcej o tym czytaj w punkcie Właściwość DirImage tego artykułu.
Właściwości PicClosePos, PicMaximizePos, PicMinimizePos.
Te właściwości określają położenie przycisków Close, Maximize i Minimize umieszczonych w zasobach programu. Więcej o tym czytaj w punkcie Właściwość DirImage tego artykułu.
Właściwości StableHeight, StableWidth.
Te właściwości niczego nie zmieniają dopóki nie zostanie wywołana funkcja StableSize. W tych właściwościach przechowywane są rozmiary formularza, które mogą zostać przywrócone po wywołaniu wymienionej funkcji. Może okazać się to przydatne jeśli dokonujemy zmiany pomiędzy skórką wczytywaną z dysku a skórką zachowaną w programie i np. skórka z zasobów powinna mieć stały rozmiar podczas gdy wczytywana może zmieniać swoje rozmiary:
void
__fastcall TForm1::Button1Click(TObject *Sender)
{
if(Skiner1->TypeSkin == tsPicture)
{
Skiner1->TypeSkin = tsFile;
Skiner1->Caption = "Test komponentu Skiner";
ChangeSkin->Flat = false;
Skiner1->LockSizes = false;
}
else
{
Skiner1->StableSize();
Skiner1->TypeSkin = tsPicture;
Skiner1->Caption = "";
ChangeSkin->Flat = true;
Skiner1->LockSizes = true;
}
}
Zakończenie.
Przedstawiłem tutaj pokrótce możliwości komponentu. Pytania proszę kierować na forum do działu Problemy z komponentami.
Opracował:
Cyfrowy Baron
Prawa autorskie do komponentu: Cyfrowy Baron.
Pobierz komponent
TSkiner - 1.0 MB (zawiera juz poprawki z drugiego sierpnia 2006r.)