Compact Framework nie wspiera rysowania przezroczystych grafik. Wszelkie rysowanie grafiki PNG lub GIF (z przezroczystością) zakończy się efektem jak poniżej:

Grafika ToolBar-a wyrysowała się z zielonym tłem, ponieważ ten kolor był ustawiony jako kolor przezroczysty.
Kod użyty do rysowania:
// Grafika z resources Image img = Properties.Resources.Buttons; // Rysowanie graphics.DrawImage(img, 0, 0);
Możemy jednak w prosty sposób wskazać Graphics-owi kolor, który ma zostać pominięty podczas rysowania, aby uzyskać efekt jak poniżej:

Grafika tym razem wyrysowała się poprawnie, pomijając kolor przezroczystości.
Aby uzyskać taki efekt musimy wskazać Graphics-owi kolor (w praktyce jest to przedział kolorów), które mają być potraktowane jako przezroczyste.
Kod użyty do rysowania:
// Grafika z resources Image img = Properties.Resources.Buttons; // Atrybuty grafiki ImageAttributes imageAttr = new ImageAttributes(); Color colorKey = new Bitmap(img).GetPixel(0, 0); imageAttr.SetColorKey(colorKey, colorKey); graphics.DrawImage(img, new Rectangle(x, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttr);
W trakcie używania ImageAttributes trzeba pamiętać o kilku rzeczach.
- po pierwsze ColorKey jest przedziałem kolorów, co oznacza iż w przypadku gdy mamy jeden kolor przezroczystości musimy ustawić dolny i górny indeks tak samo.
- po drugie cała sztuczka polega na wskazaniu koloru przezroczystości, w przykładzie jak powyżej użyłem metody GetPixel do pobrania koloru punktu na pozycj 0,0. W praktyce jednak warto zastąpić tą metodę parametrem do ustawiania koloru przezroczystości aby uchronić się przed niespodziankami.
- po trzecie musimy pamiętać iż CF nie wspiera przezroczystych kontrolek, co oznacza iż przed rysowaniem przezroczystej grafiki musimy mieć inne elementy pod spodem aby całość poprawnie wyglądała; może to być nawet kolor tła.
- po czwarte CF nie wspiera grafik o różnej przezroczystości jak np. PNG, więc nie ma szans abyśmy uzyskali przenikające się grafiki.
Na pocieszenie powiem jednak, że mamy dostęp do funkcji AlphaBlend o której napiszę kilka słów w którymś z kolejnych postów.



Adam Ciszewski
/ 2009-06-18Bardzo fajny artykul ! dla mnie jako dla początkującego programisty taki opis/tutorial okazal sie bardzo, bardzo przydatny…
pozdrawiam i dziekuje,
cichy3000
Piotr G
/ 2010-01-02Witam [VB2008]
Czy tylko tak mozna zdjąć kolor z Graphica czy z kontrolek też np. picturebox itp? Oraz jeszcze jedno pytanie jak zrobić zdarzenie onclick dla tak wyrysowanego graphica ?
Jakub Florczyk
/ 2010-01-03@Piotr G
Ad 1. Ta metoda dotyczy tylko Graphics-a. W kontrolkach jest to tylko możliwe, jeżeli napiszemy własny kod rysowania poszczególnych elementów.
Ad 2. Trzeba się podpiąć pod metody MouseDown, MouseUp, Click, DoubleClick kontrolki. A najlepiej to przeciążyć wbudowane implementacje.