GDI - Texte transparent sur Form transparent - C#/.NET managed - Programmation
Marsh Posté le 24-08-2010 à 20:38:13
Mouais, c'est plus compliqué que ça. Le problème c'est que l'API TextOut ne sait pas gérer les bitmaps avec canal alpha. J'imagine que tu dessines ton texte dans une partie de l'image ou le canal alpha vaut 0 ou presque (ie: complètement transparent).
Ton texte est bien là, mais avec un canal alpha valant 0... donc invisible. Si tu utilisais le mode opaque pour dessiner le texte, tu verrais l'arrière plan entourant le texte transparent. Si tu tiens vraiment à utiliser GDI, va falloir sortir l'artillerie lourde : dessiner ton texte dans un bitmap offscreen, puis utiliser la fonction AlphaBlend pour combiner le tout (en calculant le canal alpha à la main et en faisant gaffe d'utiliser des bitmap pré-multipliés). Yäy, c'est le fun GDI!¡!
Sinon, en .net, il me semble que tu ais directement accès à GDI+, tu devrais regarder de ce coté, car cette lib supporte l'écriture de texte avec canal alpha, avec une API un peu moins pourrie que GDI.
Marsh Posté le 25-08-2010 à 12:34:43
Merci beaucoup pour ta réponse je vais voir ce que je peux faire!
Pour ce qui est de mon utilisation de GDI c'est juste que j'ai trouvé un projet sur le net qui utilise par interop les fonctions de gdi32.dll (splashscreen png transparent sans screenshot ou quoi). Je l'ai adapté à ma sauce du coup j'essaie d'afficher du texte en appelant pareil les fonctions de gdi.
Après si on peut faire ça simplement en gdi+ je suis preneur...
Marsh Posté le 26-08-2010 à 16:04:08
Je regarde depuis hier ce qu'il se dit sur le sujet sur le net et c'est pas très positif concernant GDI+ et la transparence... La plupart des projets qui permettent une transparence d'une winform avec un png dessus utilisent les fonctions natives GDI et c'est une sacré prise de tête...
J'ai du mal à croire que rien n'a été fait en C# pour permettre une bonne gestion de la transparence des PNG sur des form sans bordures (sans passer par des appels aux fonctions de gdi32.dll par ex)... Quelqu'un a des infos là dessus ?
Merci !
Marsh Posté le 26-08-2010 à 17:47:50
Chuis pas sûr de ce que tu veux faire exactement. De ce que j'avais compris tu as un splash screen semi-transparent, tu voudrais coller du texte, genre version, build, etc ... sur une partie transparente. Normallement ça devrait fonctionner avec GDI+, par exemple un test vite fait à l'arrache :
La fenêtre en question est celle contenant la tasse de café. Il y a une fenêtre explorer juste en dessous. Le texte "Hello world" à été rajouté avec GDI+, avec un code du style à appeler juste avant UpdateLayeredWindow() :
Code :
|
Avec GDI, ton texte serait invisible sauf dans les parties ou le canal alpha > 0. C'est ce que tu voulais faire ?
Edit: c'est en C++, pas en .NET, mais l'API est très similaire.
Marsh Posté le 27-08-2010 à 12:24:21
Merci beaucoup pour ta réponse! En effet ça a l'air de bien marcher comme ça. J'ai récemment décidé de passer au WPF finalement et ça marche niquel. Je voulais utiliser le GDI/GDI+ pour rester en .NET 2.0 car je développe par dessus une appli 2.0 mais l'interop fonctionne à merveille donc aucun soucis !
Merci beaucoup!
Marsh Posté le 24-08-2010 à 15:35:39
Bonjour,
Je suis sur un projet test qui m'affiche un Windows Form qui suit la souris. Le Form est constitué d'un PNG (type splashscreen) dont j'obtiens la transparence en retapant les fonctions natives Win32 GDI. Le truc c'est que j'aimerais afficher un texte transparent qui suit ce Form à l'aide de TextOut. J'ai essayé de spécifier en paramètre le HDC du Form courant mais cela n'affiche rien... J'arrive à afficher du texte sur le DC du screen cependant, mais il ne suit pas mon form du coup...
Pour ce qui est du code, tout se passe dans la méthode Form_Paint(object sender, PaintEventArgs e). Le HDC ici est nul, ce qui permet d'écrire sur le screen directement.
Pour la classe API qui permet d'utiliser les fonctions natives :
J'utilise cette méthode là car la transparence marche plutôt bien, j'aimerais juste pouvoir rajouter du texte à côté en plus. Si quelqu'un voit où est le pépin...
Merci d'avance!