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

Re: OnMouseDown i przezroczysty obrazek

Nowy postNapisane: piątek, 2 grudnia 2011, 13:35
przez GrassHoppeR
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.

Re: OnMouseDown i przezroczysty obrazek

Nowy postNapisane: piątek, 2 grudnia 2011, 18:31
przez GrassHoppeR
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 :)

Re: OnMouseDown i przezroczysty obrazek

Nowy postNapisane: sobota, 3 grudnia 2011, 08:57
przez Cyfrowy Baron
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.

Re: OnMouseDown i przezroczysty obrazek

Nowy postNapisane: sobota, 3 grudnia 2011, 12:23
przez GrassHoppeR
a jak sprawiłbyś, żeby można było kliknąć inne elementy niż obrazek leżące pod przezroczystym? np. buttona czy memo?

Re: OnMouseDown i przezroczysty obrazek

Nowy postNapisane: sobota, 3 grudnia 2011, 14:18
przez Cyfrowy Baron
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.