Transparent form-baggrund med PNG

Tags:    c#

Findes der en simpel løsning, der understøttes i C#, til at sætte et semi-transparent PNG-billede som baggrund på en form.
Det er selvfølgelig ikke noget problem i sig selv, men sagen er at jeg ønsker at formens baggrund skal være gennemsigtig så eksempelvis skrivebordet og underliggende vinduer vises igennem formen (ligesom i samurize og lign. desktop-gadget-ting).

TransparencyKey kan selvfølgelig sættes til en given farve, hvor efter formens egen baggrundfarve sættes til samme farve. Det løser dog ikke problemet da de semi-transparente områder blot vil få den angivede farve.
Jeg har søgt en del, og flere af løsningerne går ud på at lave en række Win32 kald til bl.a. UpdateLayeredWindow, men det er relativt besværligt og det forhindrer også øvrige komponenter i at blive vist.
Ud over dette, har jeg også set nogle templates der baserer formen på noget XAML script, men det virker nu heller ikke alt for logisk.

En midlertidig løsning jeg har fundet på, er at anvende CopyFromScreen i OnPaint metoden og derved manuelt tegne den egentlige baggrund som formen dækker, hvor efter selve PNG-billedet tegnes ind over dette. Når formen flyttes bliver baggrunden hængende, men gentegnes når musen slippes (tegne-processen er alt for resource-krævende til at kunne blive udført mens formen flyttes).

Det er selvfølgelig ganske ineffektivt, men det virker. Til trods for det ville det selvfølgelig være rart med en bedre løsning som eksplicit sætter formens baggrund til et semi-transparent billede.
Findes der sådan en, eller kommer man ikke uden om Win32 eller XAML?



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
http://www.codeproject.com/cs/media/CsTranspTutorial3.asp

Hvis du ikke havde fundet frem til denne, så ser den da ganske interessant ud :)



http://www.codeproject.com/cs/media/CsTranspTutorial3.asp

Hvis du ikke havde fundet frem til denne, så ser den da ganske interessant ud :)



Jo, den havde jeg også været forbi :)
Jeg har dog ikke læst selve koden (da jeg ikke lige har en account på codeproject.com), men ift. hvad der står beskrevet om løsningen, skulle det stadig basere sig på en række Win32 kald. Og det ville jeg nu helst undgå.



... jeg har endnu ikke fundet en løsning, og må nok konstatere at man ikke kommer uden om Win32.
Tråden lukkes.



t