Problem z TImage, przezroczystość

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Problem z TImage, przezroczystość

Nowy postprzez shashor » czwartek, 10 wrzeÅ›nia 2009, 00:05

Witam.
Na wstępie chciałem powiedzieć, że jestem raczej na bakier z programowaniem, ale muszę wykonać pewien projekt i napotkałem na problem.
Jest to program graficzny wyświetlający budynki z mapy cyfrowej.

Na formie mam ScrollBoxa, a w nim 2 Timage, Image1 jest na wierzchu,z ustawionym transparent na true, Image2 jest pod nim.
Na canvasie Image1 rysuje polygony,

Gdy Image1 jest wielkości 732x856 pikseli, wszystko ładnie działa. Image1 jest transparent i widać warstwę znajdującą się pod nim ( jak na rys z linku1)
Obrazek

Gdy natomiast zwiększam Image np do 1464x1712, juz tego efektu nie ma, cos sie kopie i wyglada to tak:
Obrazek

Zauważyłem tez, ze jeśli polygony nie są wypełnianie "różnokolorowo", a tylko clWhite, to warstwa znajdująca się pod jest widoczna wewnątrz polygonow:
Obrazek

być może chodzi o TransparentColor, próbowałem zmieniać, ale nic nie sensownego nie wyszło.

Za wszelaką pomoc dziękuje.
Avatar użytkownika
shashor
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): środa, 9 września 2009, 23:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z TImage, przezroczystość

Nowy postprzez Cyfrowy Baron » czwartek, 10 wrzeÅ›nia 2009, 10:11

Gdy natomiast zwiększam Image


Ale jak zwiększasz stosujesz ZOOM np. poprzez ustawienie właściwości Stretch na true i zwiększenie rozmiaru Image czy po prostu odrysowujesz wszystko ponownie na większej powierzchni Image1?

Co do tego Stretch to nie powinno to mieć znaczenia.


Na canvasie Image1 rysuje polygony,


Pokaż kod realizujący to zadanie, gdyż nie rozumiem jak rysując cokolwiek na Image->Canvas udało ci się osiągnąć przeźroczystość tegoż Image, gdyż wiem z doświadczenia, że zawsze jak rysujesz coś na Image->Canvas, to przybiera ono kolor biały.

Do Twoich celów chyba lepszy byłby obiekt, ponieważ rysując na Image zawsze będzie wstawiane białe tło, ale cokolwiek rysujesz na PaintBox (zakładka System), będzie ono rysowane bez wypełnienia i nie naruszy tła. Oczywiście opcji Stretch tutaj nie ma wiec stosując powiększenie musisz stworzyć kod odrysowujący wszystko ponownie w nowych rozmiarach.

Kolejny problem to, że PaintBox nie przechowuje w pamięci narysowanych obiektów, wiec muszą być one odrysowywane w zdarzeniu OnPaint tego obiektu, co stwarza kolejny problem, gdyż nie można np. najpierw narysować sobie coś tam w dowolnym obiekcie typu TCanvas i przypisywać to właściwości Canvas obiektu PaintBox, gdyż obiekt klasy TCanvas przed odrysowaniem czegokolwiek musi posiadać powierzchnię, a więc musi być przypisany do innego obiektu posiadajacego powierzchnię.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
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
    NieznanyNieznana

Re: Problem z TImage, przezroczystość

Nowy postprzez shashor » czwartek, 10 wrzeÅ›nia 2009, 12:52

Jak pisałem 2 TImage są umieszczone w scrollboxie.
Tak. Za każdym razem, gdy zmieniam "zoom" muszę wszystko odrysować ponownie.

Rysowanie na TImage, następuje po naciśnięciu buttona i tam wpisane polecenia:

-ustawianie wielkości Image1 i czyszczenie Image, przed ponownym rysowaniem na nim
Kod: Zaznacz cały
       
        Image1->Picture = NULL;

        zoom= TrackBar1->Position;

        Image1->Width=imageX*zoom/100;
        Image1->Height=imageY*zoom/100;


-rysowanie na Image1 - jeśli CheckBox2 jest odznaczony, wypełniam polygony clWhite i wtedy są dla większych wartości "zooma" przezroczyste,
tak jak na ostatnim rysunku z 1 posta, czego nie do końca rozumiem
Kod: Zaznacz cały
for ( int i=0;i<78782;i++){

                if( tab[i*4]==tab[(i+1)*4])
                        r++;
                else {
                        r=r+1;
                        punkty = new TPoint [r];
                        for(int z=0;z<r;z++)
                                punkty[z]=Point(tab[(i-z)*4+1],tab[(i-z)*4+2]);

                        if ( CheckBox2->Checked == true)
                     Image1->Canvas->Brush->Color=RGB(255,255-1.8*tab[(i-2)*4+3],0);
                        else
                     Image1->Canvas->Brush->Color = clWhite;
                     Image1->Canvas->Pen->Color=clBlack;

                     Image1->Canvas->Polygon(punkty,r-1);
                       
                        r=0;
                }


        }


Za wszelaką pomoc dziękuje.
Avatar użytkownika
shashor
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): środa, 9 września 2009, 23:44
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana


  • 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 4 gości

cron