załądowanie png do Image za pomoca gdi

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

załądowanie png do Image za pomoca gdi

Nowy postprzez witekx » czwartek, 9 października 2008, 23:54

witam

problem polega na tym zgodnie z tym co znalazlem tutaj http://cyfbar.republika.pl/grafika2.html#graf4 po kliknieciu na button1 nie wyswietla mi przezroczystosci w Image1 .... na formularzu dziala ok ale na obiekcie Image1 juz nie ;/ .... wszytko zrobilem tak jak trzeba(nawet nazwy te same dla sprawdzenia dzialania ) i klapa..

potrzebuje kodu który zaladuje mi plik png do Image(z poprawną obslugą przezroczystosci)

z góry dziekuje za pomoc:)
Avatar użytkownika
witekx
 
    NieznanyNieznana

Re: załądowanie png do Image za pomoca gdi

Nowy postprzez Cyfrowy Baron » piÄ…tek, 10 października 2008, 08:48

Problemem nie jest tutaj GDI+ lecz klasa TImage, która odrysowując obiekt na płaszczyźnie Canvas tworzy dla niego tło, taka jest już natura klasy TImage. Możesz spróbować ustawić właściwość Transparent obiektu Image na true, jeżeli tło zniknie to masz rozwiązanie problemu, jeżeli nie zniknie, znaczy się, że nic z tym nie zrobisz, chyba że dokonasz konwersji na bitmapę i umieścisz w Image właśnie bitmapę. Nie bardzo rozumiem czemu upierasz się przy umieszczaniu grafiki w formacie PNG w Image, gdyż Image i tak nie obsłuży tego formatu, a to oznacza, że nie będziesz mógł wykonać żadnych operacji graficznych na takiej grafice w Image, chyba że dokonasz konwersji na bitmapę, gdyż Image nie posiada własnej powierzchni jak np. TPaintBox , lecz tylko udostępnia płótno TCanvas. Sugerowałbym skorzystać raczej z PaintBox, ale i tutaj nie da się edytować grafiki w formacie innym niż bitmapa, gdyż środowisko BCB nie udostępnia żadnych bibliotek do obsługi formatów innych niż bitmapa i JPEG, a GDI+ to biblioteka systemu Windows, BCB tylko udostępnia bibliotekę do obsługi tego mechanizmu.
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: załądowanie png do Image za pomoca gdi

Nowy postprzez witekx » piÄ…tek, 10 października 2008, 09:47

oki.. poradzilem sobie, zmieniajÄ…c Image na Paintbox ale mam kolejny problem :

mając wczytany do painboxa plik png poprzez buttona jest wszytko ok ... ale jak np zminimalizuje forme i spowrotem przywróce to grafika z paintboxa znika... chodzi mi aby automatycznie po przywroceniu formy odrysowac tą grafike która jest pod buttonem spod którego byla wczytana...

mam nadzieje ze jano to opisalem
grafika wczytana za pomocÄ… gdi
Avatar użytkownika
witekx
 
    NieznanyNieznana

Re: załądowanie png do Image za pomoca gdi

Nowy postprzez Cyfrowy Baron » piÄ…tek, 10 października 2008, 11:55

Chyba nie czytałeś uważnie porady odnośnie GDI+, wyraźnie tam napisałem:


Przy wyświetlaniu obiektu na formularzu kod odrysowujący grafikę należy umieścić w zdarzeniu OnPaint formularza, po to żeby po każdym odświeżeniu był on na nowo odrysowywany. W przypadku obiektu Image wystarczy odrysować w nim raz grafikę, gdyż odrysowywaniem po każdym odświeżeniu zajmie się wewnętrzny mechanizm tego obiektu. Tutaj istnieją dwie możliwości, można grafikę wczytać wraz z uruchomieniem programu i odrysowywać ją w dogodnym momencie, lub też wczytywać grafikę z pliku przed każdym jej odrysowaniem, inna możliwość to wczytanie grafiki do pamięci, a potem jej zmiana.




Napisałem, że w zdarzeniu OnPaint formularza, ale dotyczy to wszystkich obiektów za wyjątkiem Image, gdyż Image wywołuje to zdarzenie automatycznie.

Dlaczego tak siÄ™ dzieje?
Gdy odrysowujesz grafikę na jakiejś powierzchni (powierzchnia = np. PainBox) to pozostaje ona tam w niezmienionej formie, dopóki nie zachodzi konieczność ponownego odrysowania tej powierzchni. Gdy minimalizujesz okno, a potem je przywracasz to API systemu Windows uruchamia mechanizm odrysowywania zawartości powierzchni, ale to co Ty wyrysowałeś na tej powierzchni poprzez kod, nie zostanie na niej automatycznie odrysowane ponownie, gdyż powierzchnia nie przechowuje informacji o tym co jest na niej narysowane, więc przy ponownym odrysowaniu powierzchni to co na niej się znajdowało wcześniej, nie zostanie ponownie odrysowane. Jeżeli jednak umieścisz w zdarzeniu OnPaint powierzchni kod rysujący coś na tej powierzchni, to przy ponownym odrysowywaniu ten kod zostanie wykonany i zawartość zostanie ponownie narysowana. Dzieje się tak dlatego, że mechanizm odrysowywania powierzchni sprawdza przed jej odrysowaniem zawartość funkcji (zdarzenia) OnPaint.
Gdybyś choć raz stworzył jaki komponent, to zrozumiałbyś zasadę hermetyzacji instrukcji (kodu). To co znajduje się poza klasą musi być również wywoływane zawsze gdy zajdzie taka potrzeba poza tą klasą.
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


  • 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 1 gość