@lucasp17 - to może inaczej; Wszystkim istniejącym komponentom standardowym, jak i firm trzecich da się nadać własny wygląd;
Teraz sprostowanie - to co ludzie nazywają "własnym wyglądem" to udostępnione zdarzenia do rysowania wybranych elementów komponentu; To nie jest własny wygląd, tylko własne rysowanie pewnych elementów komponentu;
Weźmy pod lupę komponent klasy TListBox
- to co można samemu rysować, to jedynie itemy, w zdarzeniu OnDrawItem
; A co z resztą? Właśnie - nico; Nie można rysować własnej ramki komponentu, nie można wpływać na wysokość itemów (dynamicznie je zwężać i rozszerzać), nie można dodać czegokolwiek swojego, bo budowa komponentu na to nie pozwala; Jedyne co można kombinować, to dorzucać swoje elementy do obiektów listy itemów i je jakoś rysować;
Podobnie sprawa wygląda z innymi standardowymi komponentami - np. TButton
; Co można zrobić? ustawić mu szerokość i wysokość, no i nadać Caption
w wybranym stylu fonta; Nie można narysować przycisku samemu (bo nie ma zdarzenia), nie można narysować sobie np. ikonki, nie można dodać np. subprzycisku do rozwijania menu kontekstowego, nie można formatować tekstu etykiety;
Większość rzeczy jest zablokowana (a raczej nie udostępniona), więc jedyne co można w takim przypadku zrobić, to napisać wrapper na rysowanie komponentu; W taki sposób działają np. komponenty ze znanych i szanowanych paczek, jak np. Alpha Controls; Tworzy się mapę grafiki, która używana jest jako skórka interfejsu; Efektem jest kompletnie własny wygląd komponentów (z zachowaniem jego funkcjonalności), ale efektem ubocznym jest o wiele wolniejsze przerysowywanie komponentów i spuchnięty exek;
Oczywiście taka sama sytuacja jest z formularzami, którym wygląd narzuca system, lub zainstalowany w nim dodatek, który przerabia interfejs systemu i jego okien, menu itd.; Nie można łatwo stworzyć kompletnie własnego interfejsu programu, bo większość możliwości narzuca system i systemowe (standardowe) komponenty; Microsoft niemalże perfekcyjnie narzucił programistom korzystanie z natywnego wyglądu, chyba tylko po to, aby większość programów wyglądała tak, jak system; Spisek nie spisek, w każdym razie kłoda pod nogi;
Oczywiście jest na to sposób - zbudowanie komponentu od podstaw, dziedzicząc po klaasach TControl
/TWinControl
dla fokusowych komponentów, lub z TGraphicControl
dla niefokusowych (etykiet, obrazków itd.); Roboty więcej, ale dzięki temu można stworzyć dowolny komponent, posiadający dowolne zdarzenia, dowolne subkomponenty, dowolne rysowanie, dowolne właściwości i metody; Aby stworzyć własny komponent, wystarczy znajomość OOP w średnim stopniu i chęci główkowania, bo roboty nie jest wiele; Plusem ogromym jest na pewno kompletnie własny wygląd i możliwości, a drugim ogromnym plusem jest to, że aplikacja z takimi komponentami będzie wyglądać i zachowywać się tak samo na każdej wersji systemu Windows (nie wspominam już o Linuxach i jabłku);
W najbliższych miesiącach (pewnie do zimy) będę pracował nad projektem, który posiadać będzie kompletnie własny wygląd, bazując na komponentach napisanych od zera; Część ciekawszych komponentów (do uniwersalnych zastosowań) postaram się tutaj udostępnić (pewnie nie za darmo); Zobaczymy co z tego wyjdzie, ale już można śmiało stwierdzić, że liczba możliwości jest nieskończona;
A co poruszonej przez @olesio kwestii wyglądu aplikacji - programy są różne, jedne wyglądają odjazdowo, są funkcjonalne i intuicyjne; Inne z kolei są funkcjonalne, ale interfejs woła o pomstę do nieba; Ostanio miałem do czynienia z programem do obsługi sklepu (nazwy nie podam, choć to nie mój program) - sprzedaż, rozliczenia, faktury, magazyny itd.; Interfejs aplikacji jest w nim swoistą hybrydą - połączenia Windowsów 3.1, 98, 7, 8; Wygląda słabo, nawet jak na tak ważne narzędzie, niemalże każdy formularz zawierał po ok. 100 komponentów, część upakowana tak gęsto, że czasem cięzko kursorem trafiź, do tego sporo wpakowanych do zakładek; Funkcjonalność natomiast na pierwszy rzut oka bogata; W praktyce jednak sporo niedociągnięć, ułomności; głupi filtr do wyszukiwania towaru po nazwie działa na zasadzie zwykłego pascalowego Pos - jak podasz słowa na odwrót to nulla znajdziesz; Albo inna rzecz - wpisując nowy towar do magazynu, nie można podać mu od razu jego ilości; Przy wprowadzaniu ponad tysiąca produktów, trzeba je najpierw wprowadzić po nazwie, następnie od nuwa wyszukiwać, aby podać ich ilość; Zamiast tysiąca iteracji, mamy dwa tysiące, co przełożyło się na 10 godzin podawania sanych ilości produktów; Za 5 godzin obsługi programu naliczyłem co najmniej 20 różnych ułomności, a program kosztował coś koło 800zł, w wersji nieco ponad podstawowej...
Napiszę tak - interfejs aplikacji to bardzo ważdny element, dlatego że to jedyna część programu, z którą ma do czynienia użytkownik; Musi od wyglądać dobrze - jeden styl, urozmaicone komponenty, pogrupowane tematycznie, nie za dużo, nie za mało, część schowane pod rozwijanymi menu, część widoczne; Do tego sensowne hinty lub opisy, jak największa intuicyjność; GUI aplikacji musi być z jednej strony przyjazne dla oka, z drugiej storny intuicyjne, aby użytkownik od razu wiedział co i jak się wykonuje;
Kolejna rzecz to funkcjonalność aplikacji - program musi w pełni realizować przyjęte funkcje; Muszą one działać perfekcyjnie, bo program ładnie wyglądający ale wadliwy lub opośledzony jest jak choinka - co z tego że ładna, świecąca, wręcz animowana, skoro nieporęczna, zajmuje miejsce i blokuje światło;
Wygląd, intuicyjność, funkcjonalność i niezawodność aplikacji to trzy cztery najważniejsze elementy każdego programu, a określanie im priorytetów to ocena subiektywna; Natomiast przyłożenie się do ich wszystkich i ich opracowanie na jak najwyższym poziome, uczyni każdą aplikację arcydziełem; Szkoda, że w dzisiejszych czasach pieniądz jest ważniejszy od przyjemności, jaką użytkownik może czerpać z obsługi software'u.