Salut à tous !!
J'ai un TP qui consiste à faire un lecteur multimédia, bon jusque là rien de compliqué, alors je me suis dit que j'allais faire un truc un peu plus sympa.. Pour ça j'ai donc voulu refaire le design des controles, qui sont relativement moches d'origine..
J'ai donc fouillé pas mal sur le net et j'ai fini par créer un nouveau contrôle en surdéfinissant la méthode OnPaint, je vous passe les détails.. Ensuite j'ai créé un joli bouton sous 3ds et j'ai exporté l'image en png (pour conserver le canal alpha)
J'ai réglé à peu près tout ce qu'il faut, et voilà ça marche pas trop mal.. Mais justement pas assez bien !
En fait j'ai un petit souci, c'est que quand je fais un aperçu de mon bouton sous windows ou n'importe kel éditeur d'image, il fait l'interpolation nickel avec le canal alpha et la transparence bien comme il faut et c'est superbe, seulement une fois dans le programme c'est pas super joli, bon on voit pas le contour de l'image mais c'est quand même pas super bo.. Enfin je vous mets l'image ça sera plus parlant :
A gauche on voit le rendu sous windows, qui est nickel tout lissé et tout, et à droite le rendu dans le programme, qui est pas si mal mais mal lissé et avec une espèce de bande noire autour..
Pour info, voilà ce que j'ai rajouté dans le constructeur du controle :
Et voilà la méthode OnPaint :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); //Pour activer le double buffering SetStyle(ControlStyles.SupportsTransparentBackColor,true); //Pour activer la gestion de la transparence BackColor = Color.Transparent; //Pour que ça apparaisse correctement sur le controleur parent
Voilà, si quelqu'un peut m'expliquer pourquoi ça fait cet effet bizarre alors que l'aperçu est nickel, je voudrais bien savoir..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 { cursorYmin = Height/2 - cursorHeight/2; cursorYmax = Height/2 + cursorHeight/2; //Calcul de la position de l'objet base.OnPaint(pe); //Appel de la méthode de dessin de la base g = Graphics.FromImage(buffer); //on récupère un Graphics temporaire dans buffer qui est un Bitmap g.Clear(BackColor); //On réinitialise le buffer ColorMatrix cm = new ColorMatrix(); ImageAttributes ia = new ImageAttributes(); ia.SetColorMatrix(cm); //Création des attributs pour l'affichage g.DrawImage(buttonBitmap, new Rectangle(cursorXmin,cursorYmin,cursorWidth,cursorHeight), 0,0,buttonBitmap.Width, buttonBitmap.Height, GraphicsUnit.Pixel,ia); //Affichage de l'image proprement dite, avec les bons paramètres pe.Graphics.DrawImage(buffer, 0, 0); //Envoi du buffer }
Merci à tous !!
Partager