mars
2011
Qui n’a jamais dû dessiner une image transparente avec le Compact Framework sur Windows Mobile ou pire Windows CE ?
Le plus simple est d’utiliser une image PNG. Le problème étant que le Compact Framework ne prend pas en charge la transparence.
Il faut donc utiliser les dlls de l’OS afin de remédier à ce petit problème.
Après un petit tour sur le web,on trouve assez rapidement qu’il faut utiliser l’API Imaging. On peut également utiliser l’API Alpha blend afin de rendre transparente une image qui ne l’est pas, mais les possibilités ne sont pas aussi étendues qu’avec une image PNG.
Une fois cette info en poche, un petit tour sur PInvoke.net nous apprend qu’il faut utiliser un object COM nous permettant par la suite d’avoir une interface IImage, représentant une image transparente, et une interface IImagingFactory, permettant de créer des objets de type IImage.
L’imprémentation en est très bien expliqué dans le post Alphablending with NETCF de Chris Lorton.
Une fois les diverses structures et interfaces en place, on lance le projet et tout marche, on a de la transparence !
Enfin, pas pour tous. Vous n’êtes peut-être pas tombé dessus, mais en changeant les coordonnées du rectangle de destination d’une IImage l’exception ArgumentException avec le message très explicite « 0x80070057″ peut être levée.
Une fois connue, la raison en est simple : le rectangle de destination ne fonctionne pas exactement de la même manière que dans les autres fonctions de dessin.
Le rectangle est normalement composé de 4 entiers : X et Y représentent les coordonnées du point situé en haut à gauche de la zone à dessiner et Width et Height représentent la largeur et la hauteur de la zone à dessiner.
Mais dans le cas présent, si X et Y gardent la même fonction, c’est Width et Height qui sont différents. En effet, ils ne correspondent pas à la largeur et la hauteur du rectangle dont le point en haut à gauche est situé à X,Y mais à 0,0.
Il faut donc ajouter X à la largeur voulue et Y à la hauteur voulue :
Rectangle(X, Y, X + Width, Y + Height)
Par exemple, j’ai une image avec ce rectangle de destination: 0, 0, 50 ,50.
Si je souhaite la déplacer, j’aurais donc ce rectangle de destination: 20, 30, 20 + 50, 30 + 50, afin de conserver les proportions de l’image.
Update :
Un petit plus afin de gagner du temps lors du dessin, pensez à utiliser la méthode SetImageFlags avec en paramètre ImageFlagsCaching de l’objet IImage.
Plus d’informations ici (attention, code non-managé).
Bonne chance avec vos projets Compact Framework !