CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - OnMouseDown i przezroczysty obrazek

OnMouseDown i przezroczysty obrazek

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: OnMouseDown i przezroczysty obrazek

Nowy postprzez GrassHoppeR » piątek, 2 grudnia 2011, 13:35

jeśli piszesz o tym, że w onmousedown sprawdzasz czy współrzędne myszki należą do danego prostokąta, to wciąż piszesz o czymś innym. taka metoda jest prosta jak drut i nie ma o czym mówić. z resztą powtarzam to dziesiąty raz - tak to ja już zrobiłem. pytam czy można inaczej.
założenia:
mamy obrazki porozrzucane na całej formie, z różnymi rodzicami, gdziekolwiek na memo, na panelu czy na imageu. obrazki mają przezroczyste tło i będą przesuwane myszką.
onmousedown danego obrazka ma reagować tylko, kiedy kliknięty został nieprzezroczysty jego fragment. jeśli został kliknięty obszar przezroczysty zdarzenie ma zostać zignorowane.
ewentualnie onmousedown klikniętego obrazka może się wykonać, ale nie może to przeszkodzić w wywołaniu onmousedown elementów poniżej.
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 GrassHoppeR » piątek, 2 grudnia 2011, 18:31

pociągnę temat dalej. zamieszczam program, który NIE spełnia powyższego warunku. jest za to bardzo prosty no i składa się w zasadzie tylko z definicji klasy:
w nagłówku:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
bool move=false;
//---------------------------------------------------------------------------
class TSuwak : public TImage
{
private :
public :
int X;
int Y;
__fastcall TSuwak::TSuwak(TComponent* Owner):TImage(Owner)
        {
        Parent = dynamic_cast<TWinControl*>(Owner);
        OnMouseDown=On1MouseDown;
        OnMouseMove=On1MouseMove;
        OnMouseUp=On1MouseUp;
        Width=50+rand()%150;
        Height=50+rand()%150;
        Transparent=true;
        Canvas->Brush->Color=clWhite;
        Canvas->FillRect(BoundsRect);
        Canvas->Brush->Color=TColor(RGB(rand()%255,rand()%255,rand()%255));
        Canvas->Ellipse(10,10,Width-10,Height-10);
        }

void __fastcall TSuwak::On1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
          {
          ((TSuwak*)Sender)->X=X;
          ((TSuwak*)Sender)->Y=Y;
          ((TSuwak*)Sender)->BringToFront();
          move=true;
          }

void __fastcall TSuwak::On1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
          {
          if (move)
                {
                ((TSuwak*)Sender)->Left+=X-=((TSuwak*)Sender)->X;
                ((TSuwak*)Sender)->Top+=Y-=((TSuwak*)Sender)->Y;
                }
          }

void __fastcall TSuwak::On1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
          {
          move=false;
          }
};

i w programie np.:
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i=0; i<100; i++)
        {
        TSuwak* Suwak = new TSuwak(Form1);
        Suwak->Left=rand()%600;
        Suwak->Top=rand()%400;
        }
}
a jak równie prosto zrobić to z uwzględnieniem przezroczystości?

PS. wszelkie uwagi na temat kodu mile widziane :)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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 » sobota, 3 grudnia 2011, 08:57

GrassHoppeR napisał(a):w onmousedown sprawdzasz czy współrzędne myszki należą do danego prostokąta,


GrassHoppeR napisał(a):onmousedown danego obrazka ma reagować tylko, kiedy kliknięty został nieprzezroczysty jego fragment. jeśli został kliknięty obszar przezroczysty zdarzenie ma zostać zignorowane.


Cyfrowy Baron napisał(a):który ma w tej pozycji piksele przeźroczyste i wybrać ten, który ich nie ma.


Chodzi o to, że po zlokalizowaniu obrazka sprawdzasz, czy myszka znajduje się nad jego pikselem przeźroczystym czy nie.
Czy można inaczej? Pewnie można by wymyślić inny sposób, ale niekoniecznie bardziej efektywny. Gotowych rozwiązań na to nie ma. Jak już ustaliliśmy przeźroczystość to tylko pewna wartość piksela, więc nie można tutaj traktować przeźroczystości w obrazkach, jakby była ona czymś wyjątkowym, innym od nieprzeźroczystości.
Zastanawiałem się jak można by to zrobić inaczej, ale nic nie przychodzi mi do głowy. Gdybym to ja robił, zrobiłbym to właśnie tak.
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 » sobota, 3 grudnia 2011, 12:23

a jak sprawiłbyś, żeby można było kliknąć inne elementy niż obrazek leżące pod przezroczystym? np. buttona czy memo?
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 » sobota, 3 grudnia 2011, 14:18

GrassHoppeR napisał(a):np. buttona czy memo?


Obiekt typu TImage nie jest w stanie przesłonić obiektów typu TButton czy TMemo. Nie jest w stanie przesłonić żadnego obiektu poza innym typu TImage, TBevel itp.
Dla dwóch przesłaniających się obrazków można by to zrobić jak w przykładowym programie w załączniku, ale dla większej liczby robi się to bardziej skomplikowane.
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

Poprzednia 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 6 gości