Image jako przycisk

0

Proszę o pomoc, jak w Delphi zrobić efekt znany z programów graficznych jako "buttonize". Na obrazku w Image powstaje ramka 3D, ale nie stworzona przy pomocy gradientu, lecz z jego półtransparentnych krawędzi. Zachodzi też potrzeba regulacji jej szerokości.

0

SpeedButton nie odpowiada moim założeniom. Ramka ma być tworzona z rozjaśnionego (lewo, góra) i przyciemnionego (prawo, dół) brzegu oryginalnego Image i muszę mieć możliwość ustawiania jej szerokości. Jakieś inne pomysły ?

0

to sobie narysuj sam (najlepiej opakuj całość w komponent) albo znajdź gotowca

1

Gdybym potrzebował stworzyć taki przycisk, to bym po prostu swoją kontrolkę napisał. W zależności od tego, czy przycisk ma łapać fokusa czy nie, trzeba rozszerzyć bazową klasę TGraphicControl/TWinControl (albo TCustomControl — nie pamiętam co w Delphi jest odpowiednie dla kontrolek z uchwytem), dorzuciłbym wszystkie potrzebne właściwości podstawowe, a także dodatkowe z obrazkami dla różnych stanów przycisku oraz liczbową, z szerokością obramowania.

Kwestia renderowania to metoda Paint — w niej trzeba namalować odpowiednie tło, obrazek i ramkę. Z ramką jest ten problem, że musi być renderowana dynamicznie, skoro można ustalać jej parametry. Do tego celu można wykorzystać tylny bufor, czyli zwykłą bitmapę, na której namaluje się wszystko co potrzeba, a potem ją na płótnie komponentu. W razie czego można skorzystać ze ScanLine, aby przyspieszyć renderowanie.

Pytanie tylko, jak ma wyglądać ten przycisk? @grino1: masz jakiś prototyp, aby można było zobaczyć gotowy efekt dla różnych stanów przycisku? Bo bez konkretów to można jedynie ogólnie napisać jak to zrobić — i wyżej masz instrukcje.

0

Pozostaje mi tworzyć samemu, gdyż gotowca nie mogę znależć. Do tej pory pracowałem na obrazkach czarno białych. Tworzyłem dośrodkowy gradient czarno biały na płótnie, a następnie wrzucałem na niego przy pomocy stratchdraw pomniejszony obrazek i jakoś to wyglądało. Teraz mam to zrobić w kolorze by uzyskać taki np. wynik:
screenshot-20210924193913.png
Można rozjaśnić programowo założoną ilość linii u góry i po lewej stronie i odpowiednio zaciemnić pozostałe, ale to żmudna robota. Liczyłem na jakąś regułę matematyczną by to przyspieszyć.
Dziękuję wszystkim za okazaną pomoc.

2
  1. Jak chcesz robić poza Delphi, to możesz napisać własny filtr dla GIMPa, który robi to co chcesz, wtedy wystarczy otworzyć obrazek w GIMPie i użyć filtra. Nie będzie to żmudne.
  2. Żeby zwiększyć jasność pomnóż wartości kanałów RGB przez liczbę większą niż 1.0, przycinając nadmiarowe wartości kanałów do maksymalnie 255 lub 1.0 (w zależności od reprezentacji).
  3. Żeby zwiększyć ciemność koloru pomnóż wartości kanałów RGB przez liczbę mniejszą niż 1.0 i większą niż 0.0.

Skrypt GIMPa operuje na funkcjach normalnie dostępnych w programie. Musisz tylko dojść do tego jak zrobić zaznaczenie poszczególnych obszarów obrazka i zastosować funkcję jasność i kontrast z wybranymi parametrami. Pomoże Ci jakiś przykładowy skrypt *.scm oraz Pomoc/Przeglądarka procedur.

0
grino1 napisał(a):

Pozostaje mi tworzyć samemu, gdyż gotowca nie mogę znależć.

Nie ma sensu szukać gotowców, bo wymagania masz unikalne, więc niczego nie znajdziesz. Napisałem Ci wyżej jak podejść do tego tematu — napisać swoją kontrolkę i wyposażyć ją we wszystkie przypadne właściwości, aby móc renderować obrazki razem z ramką. Napisanie takiego komponentu jest bardzo proste (o ile ogarnia się podstawy pisania komponentów).

Można rozjaśnić programowo założoną ilość linii u góry i po lewej stronie i odpowiednio zaciemnić pozostałe, ale to żmudna robota. Liczyłem na jakąś regułę matematyczną by to przyspieszyć.

Jak pisałem — komponent powinien mieć zestaw właściwości, dzięki którym można sobie ustalić wygląd ramki. I na podstawie tych właściwości, metoda renderująca będzie malować odpowiednie tło oraz sparametryzowaną ramkę. Toż to kilka liczbowych właściwości, a samo renderowanie to prosta matematyka.

Aby wyrenderować gotowy obrazek (jak w podanym przykładzie), wystarczy mieć pomocniczą bitmapę. Maluje się na niej obrazek, a następnie rozjaśnia i przyciemnia odpowiednie piksele. Jeśli ma się parametry ramki we właściwościach, to wiadomo jak gruba ma być (jedna liczba) oraz jak mocno ta ramka ma rozjaśniać/przyciemniać (można użyć jednej liczby lub dwóch, osobno dla rozjaśniania i osobno dla przyciemniania, albo cztery — dla każdego boku osobno). Przyciemnianie i rozjaśnianie to prosta interpolacja liniowa — w sieci bez problemu znajdziesz przykłady rozjaśniania i przyciemniania pikseli. Na koniec renderuje się bufor na płótnie komponentu i to wszystko.

0

Oczywiście, zgodnie z tym, co napisałem w pierwszym zdaniu chodziło mi o procedurę w Delphi, a nie filtr w programie graficznym typu Gimp. Problem doskonale rozwiązuje procedura Buttonize w pliku janFX ze strony https://torry.net/authorsmore.php?id=1518. Jeszcze raz dziękuję za wsparcie, niekiedy w oczywistych dla mnie kwestiach. Polecam zainteresowanym i kończę wątek.

1

Skorzystaj z gotowych skórek dla Delphi. Skoro zależy Tobie tylko na Button to kiepskie rozwiązanie. Musisz ogarnąć jak Van Gogh pozostałość. Czyli wszystko na płótnie a w Twoim przypadku Form

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