OnMouseDown i przezroczysty obrazek

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez polymorphism » środa, 30 listopada 2011, 14:17

No widzisz, dlatego opcja z image'ami jest zła.

p.s. napisz może, co to ma być.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
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 XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » środa, 30 listopada 2011, 14:42

zrobiłem własne suwaczki oparte o TImage no i byłoby wszystko w porządku, gdyby nie te przezroczyste części obrazków. chciałem nieco inaczej ale jak zwykle skończyło się bazgraniem po panelu i sprawdzaniem pozycji imidżów w pętli... do tego jeszcze trzeba będzie dodać tablice z kolejnością no i już wygląda tak, jak nie lubię gdy wygląda. :roll:
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » czwartek, 1 grudnia 2011, 07:32

Zamiast bawienia się w robienie suwaków z Image, czego sam kiedyś próbowałem z marnym skutkiem, polecam komponent VCLSkin.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez polymorphism » czwartek, 1 grudnia 2011, 10:55

(...) do tego jeszcze trzeba będzie dodać tablice z kolejnością

Jeśli zamiast image'ów dasz bitmapy (TBitmap), co byłoby naturalną konsekwencją rysowania po panelu, wtedy "tablica z kolejnością" jest przede wszystkim kontenerem dla tych suwaków/bitmap, zatem jej istnienie nie jest jakimś dodatkowym, przykrym wymogiem.

no i już wygląda tak, jak nie lubię gdy wygląda. :roll:

Bo jak się wszystko pisze w jednej formie, to faktycznie może to wyglądać źle ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
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 XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » czwartek, 1 grudnia 2011, 12:34

Zamiast bawienia się w robienie suwaków z Image,
gotowce gotowcami, a gdzie tu walor naukowy? ;)
a tak poważnie to mam po prostu specyficzne wymagania więc lepiej jak napiszę sobie sam prosty komponent, który będę dostosowywał do potrzeb na bieżąco niż jak zacznę uczyć się obsługi cudzych komponentów z resztą bez gwarancji, że uzyskam to co założyłem.

Jeśli zamiast image'ów dasz bitmapy (TBitmap), co byłoby naturalną konsekwencją rysowania po panelu, wtedy "tablica z kolejnością" jest przede wszystkim kontenerem dla tych suwaków/bitmap
w tej chwili przechowuję suwaki w wektorze, w którym ich kolejność jest istotna więc dla kolejności rysowania muszę stworzyć dodatkowe tablice i to komplikuje użycie suwaków, a nie lubię takiego komplikowania i to miałem na myśli pisząc o wyglądzie, a nie pisanie w jednej formie. z resztą wolę mieć wszystko pod ręką przynajmniej na obecnym etapie pracy nad programem. jednak przez te przezroczystości muszę trochę zmienić założenia i prawdopodobnie użyję klasę TBitmap, bo do tej pory każdy suwak był autonomiczny (z własnym onmousedowm/move) a teraz będę je grupował i obsługiwał z poziomu grupy, więc właściwości imidża nie będą już chyba potrzebne.
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » czwartek, 1 grudnia 2011, 12:50

Suwaki to element interfejsu systemu. Zastępując go własnym komponentem nie uzyskasz pożądanych efektów. Komponent który Tobie zaproponowałem nakłada maskę na suwaki systemowe, więc działa idealnie, tak to wygląda w praktyce:

suwaki.png


Chcesz zrobić własne suwaki. To się chwali, ale zamiast bawić się Image poszukaj rozwiązanie polegającego na nakładaniu maski na interfejs systemu, tak jak to robi zaproponowany przeze mnie komponent. Nie podaję tego rozwiązania, gdyż go nie znam, ale skoro potrafi robić to ten komponent, to jest to jak najbardziej możliwe. W ten sposób uzyskasz dokładnie to czego chcesz, czyli to system będzie kontrolował zachowanie się suwaków.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » czwartek, 1 grudnia 2011, 13:24

ale ja nie robię suwaków takich jak systemowe. potrzebuję suwaki o nieco innym zastosowaniu i nie potrzebuję w nich żadnego wymyślnego ficzeru, a już na pewno nie chodzi mi o "graficzkę".
takie są moje suwaczki:
Obrazek

Chcesz zrobić własne suwaki.

suwaki to ja już zrobiłem ;) problem wystąpił tylko w związku z przezroczystością. pozostał jednak nierozwiązany a raczej porzucony, ale może ktoś kiedyś poda rozwiązanie.

dzięki za VCLSkin.
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez polymorphism » czwartek, 1 grudnia 2011, 14:04

GrassHoppeR napisał(a):takie są moje suwaczki:
Obrazek

Przecież to spokojnie można zrobić jako pojedynczą kontrolkę, bez zbytniego wydziwiania.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
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 XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » czwartek, 1 grudnia 2011, 14:08

Można by to zrobić za pomocą jednego Image, całość jako grafikę. Najistotniejszy jest tutaj algorytm wyliczający pozycję suwaków, reszta to tylko graficzna interpretacja. tak gwoli ścisłości to są już na to gotowe biblioteki, tylko nie mogę sobie teraz przypomnieć w jakim pakiecie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » czwartek, 1 grudnia 2011, 14:21

Przecież to spokojnie można zrobić jako pojedynczą kontrolkę, bez zbytniego wydziwiania.

początkowo każdy suwaczek był oddzielną kontrolką. służył do przedstawienia jednej zmiennej z wczytywanego z pliku skryptu. w onmouseup zmienna ta była uaktualniana bez jakichkolwiek zbędnych operacji. skoro jednak musiałem obejść problem przezroczystości i wykorzystać dodatkowy panel grupowy to równie dobrze mogą być teraz na jednej kontrolce, którą z resztą zamierzam rozszerzyć o dodatkowe elementy.

Najistotniejszy jest tutaj algorytm wyliczający pozycję suwaków, reszta to tylko graficzna interpretacja.

no, to już było potrzebne w tej najprostszej wersji suwaków i żadnego problemu z tym nie było. problem pojawił się właśnie z grafiką...
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 10:14

To przecież z Tobą prowadziliśmy swego czasu dyskusję nad przesuwaniem obiektów po Image w wątku Przyspieszenie wyświetlania na ekranie. Podałem tam kod, który przesuwał klocek będący tylko grafiką, a nie odrębnym obiektem i wykrywał go prawidłowo, czyli wybierany był klocek wskazywany przez mysz. To w zasadzie gotowe rozwiązanie, do którego wystarczy dodać więcej klocków. A wiedząc który klocek klikasz nie ma problemu z obsługą pojedynczego zdarzenia dla jednego Image. W zależności od wybranego klocka wystarczy wywołać odpowiednie parametry w zdarzeniu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » piątek, 2 grudnia 2011, 12:20

spoko, ale nie chodzi mi tu o wykorzystanie takiego samego sposobu, bo - że się tak wyrażę - mam to już obcykane. z resztą to, że tam klocki nie były obiektami (no w zasadzie to były) to uzasadnione, w tym przypadku nie jest to takie oczywiste. chciałem zrobić to po prostu inaczej (a właściwie zrobiłem, tylko wystąpił problem z tą przezroczystością). chciałem przy okazji zrobić sobie prosty komponent, by móc wykorzystać go w przyszłości. zwykły obrazek z paroma dodatkowymi parametrami typowymi dla suwaka i obsługą przesuwania. i w zasadzie się udało, ale i tak był konieczny krok naprzód i okej, teraz też jest fajnie, a czego się nauczyłem to moje. cały czas jednak męczy mnie ta sprawa z onmousedown, bo obejście problemu to jednak nie to samo co jego rozwiązanie.

przy okazji, skoro już wspomniałeś o tamtym wątku, to chciałem się pochwalić, że udało mi się jeszcze bardziej przyspieszyć wyświetlanie. :D skorzystałem z paintboxa i ustawiłem pędzel formy na clear i paintbox na opaque. i z kilkudziesięciu procent zużycia procesora i niepłynnego ruchu przy przewijaniu zrobiło się raptem parę procent i płynniuteńki ruch. :) także warto czasem podrążyć temat. mam nadzieję, że i tytułowy problem też w końcu uda mi się rozwiązać.
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 12:35

GrassHoppeR napisał(a):i z kilkudziesięciu procent zużycia procesora i niepłynnego ruchu przy przewijaniu zrobiło się raptem parę procent i płynniuteńki ruch.


Ja już nie widzę sensu w dalszej optymalizacji tego kodu, gdyż po wymianie komputera na nowy - dziś sprawdzałem swój ostatni projekt z tamtego wątku - obciążenie procesora wynosi poniżej 1%, a obciążenie karty graficznej jest znikome.

Co do tego Twojego komponentu, to rozwiązanie polegające na użyciu jednego Image z grafiką i obsługą jak to było już omówione wcześniej wydaje się najprostsze i najskuteczniejsze, nie ma też żadnego problemu, by zrobić z tego komponent oparty na klasie TImage.

Twój problem polega na tym, że sądzisz iż przeźroczystość to brak obiektu lub grafiki, a to nieprawda, obiekt w tym miejscu jest, grafika też ma tło, tyle tylko, że to tło jest usuwane podczas odrysowywania obiektu, a właściwie, to w miejsce tego tła jest rysowane to co pod tym obiektem się znajduje, czyli tak naprawdę to przeźroczystość jest tylko złudzeniem, po prostu GDI odwala za programistę robotę przerysowując co trzeba tam gdzie trzeba.
Tak więc nie da się kliknąć na to co znajduje się pod przeźroczystością, gdyż jest to przesłonięte przez obiekt przeźroczysty. Przeźroczystość to obiekt a nie pustka!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » piątek, 2 grudnia 2011, 12:53

Twój problem polega na tym, że sądzisz iż przeźroczystość to brak obiektu lub grafiki,

ależ ja doskonale sobie z tego zdaję sprawę. w zasadzie jestem (hobbystycznym) programistą grafiki, więc doskonale się w takich zagadnieniach orientuję. moim problemem jest to, że sądzę, iż można zmusić system do uznania obiektu za niekliknięty pod pewnymi warunkami - w tym przypadku jeśli współrzędne myszki wskazują na przezroczyste tło - i tym samym sprawdzania kolejnych elementów. takim rozwiązaniem mogłoby być sprawdzenie w onmousedown czy tło jest przezroczyste, a następnie wyłączenie tego elementu (enabled=false) i "sztuczne" wywołanie kliknięcia, ale takie rozwiązanie wydaje mi się dosyć "brzydkie". dlatego pytałem o jakieś inne rozwiązanie. bo jeśli system sprawdza kliknięcie tylko na podstawie clientrect to trzeba robić sztuczki, ale być może sprawdza na podstawie jakiegoś kształtu, który tylko domyślnie jest prostokątem i można go definiować? nie wiem, więc pytam.

Ja już nie widzę sensu w dalszej optymalizacji tego kodu, gdyż po wymianie komputera na nowy - dziś sprawdzałem swój ostatni projekt z tamtego wątku - obciążenie procesora wynosi poniżej 1%, a obciążenie karty graficznej jest znikome.

no tak, ale ja dążę do perfekcji. ;) przy okazji nie lubię jak komp wykonuje niepotrzebne operacje.
a tak poważnie, to program, który sprawdzałeś to nie to samo o czym piszę. problem z przycinaniem występował przy przewijaniu timelinu z klockami (czyli w praktyce odrysowywaniu wszystkich widocznych klocków) i przez podwójne buforowanie, mazanie tła w imidżu itp. program się zatykał, co skutkowało przeskokami i zużyciem procesora 100%. po optymalizacji jest tylko kilka procent. tak więc jej sens jest niewątpliwy, przynajmniej dla mnie...
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 13:11

GrassHoppeR napisał(a):[...] bo jeśli system sprawdza kliknięcie tylko na podstawie clientrect to trzeba robić sztuczki, ale być może sprawdza na podstawie jakiegoś kształtu, który tylko domyślnie jest prostokątem i można go definiować? nie wiem, więc pytam.


A sprawdziłeś jak ja to zrobiłem w przykładowym programie z wątku Przyspieszenie wyświetlania na ekranie.. Jest tam na tle rysowany prostokąt, który jest tylko elementem graficznym, ale mimo to jest wykrywany przez system, gdy zostanie wskazany myszką. Dokładnie tego samego mechanizmu możesz użyć u siebie. Tyle tylko, że tam sprawdzana jest pozycja obiektu, więc jeżeli dwa obiekty znajdują się w tej samej pozycji to zostanie wybrany ten wyżej, no ale zawsze można to tak oprogramować, by w przypadku kilku obiektów w tej samej pozycji sprawdzać, który ma w tej pozycji piksele przeźroczyste i wybrać ten, który ich nie ma.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

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