[win32] fenêtre transparente ET clickable

fenêtre transparente ET clickable [win32] - C - Programmation

Marsh Posté le 13-11-2003 à 19:43:48    

En gros, j'ai un éditeur de texte (une fenêtre toute con avec un EDIT dedans), et je voudrais que le fond soit transparent. J'ai trouvé à la faire en rendant la couleur de fond du contrôle transparente :

Code :
  1. SetWindowLong(hwndMain, GWL_EXSTYLE, WS_EX_LAYERED);
  2. SetLayeredWindowAttributes(hwndMain, RGB(255, 255, 255), LWA_COLORKEY);


Le fond de la fenêtre est bien transparent, et même trop : quand on clique dans la fenêtre, c'est la fenêtre en dessous qui reçoit le clic.
Donc ma question est simple : comment obtenir le même résultat tout en continuant à recevoir les clics ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 13-11-2003 à 19:43:48   

Reply

Marsh Posté le 14-11-2003 à 12:59:25    

heupe !


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 13:04:43    

dsl aucune idee, mais franchement l'API win32, t sur ? :D

Reply

Marsh Posté le 14-11-2003 à 13:07:03    

chrisbk a écrit :

dsl aucune idee, mais franchement l'API win32, t sur ? :D

Oui. Quoi d'autre ? MFC ? WinFX ? :D
J'ai envie de faire du win32, c'est une expérience.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 13:07:59    

R3g a écrit :

Oui. Quoi d'autre ? MFC ? WinFX ? :D


 
Winforms :D

R3g a écrit :


J'ai envie de faire du win32, c'est une expérience.


Ah ca, on s'en rapelle longtemps [:joce]
(mais au moins on sait comment ca fonctionne par derriere, parfois c bien pratique)

Reply

Marsh Posté le 14-11-2003 à 13:13:51    

winforms c'est .NET, c'est ça ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 13:14:53    

ouaip...Maintenant ca ne veut pas forcement dire passage au c#/vb.net obligatoire t'as le managed c++ pour une transition en douceur. Mais je crains quand meme d'avoir repondu a coté de la plaque, tu fais du C par choix ?

Reply

Marsh Posté le 14-11-2003 à 13:16:20    

Oui c'est un choix. Jusqu'ici je n'ai fais quasiment que du java et du vb (là c'était pas un choix), et je voulais voir ce que c'était de faire de la prog windows façon roots.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 17:03:51    

Bon, et sinon, quelqu'un aurait une suggestion ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 17:46:43    

c'est juste un détail, mais ta manière de faire marche seulement sous 2000/XP, alors qu'y a une autre méthode : passer par SetWindowsRgn() pour spécifier une 'région' à une fenêtre.
 
par contre ca revient au même, c'est la fenêtre d'en dessous qui recevra les clics.

Reply

Marsh Posté le 14-11-2003 à 17:46:43   

Reply

Marsh Posté le 14-11-2003 à 17:50:07    

Konar a écrit :

c'est juste un détail, mais ta manière de faire marche seulement sous 2000/XP, alors qu'y a une autre méthode : passer par SetWindowsRgn() pour spécifier une 'région' à une fenêtre.
 
par contre ca revient au même, c'est la fenêtre d'en dessous qui recevra les clics.

OUi je sais. En fait c'est pas tout à fait pareil : déja ça marche pas du tout de la même façon "derrière", d'après ce que j'ai compris, et surtout ça me permet de gérer aussi la transparence globale de ma fenêtre avec LWA_ALPHA.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-11-2003 à 17:55:03    

tu peux tenter un truc ultra moche, compliqué et pas sur de marcher : tenter de dessiner tes bouts de fenetre en te basant sur la fenetre d'en dessous, en gros dessiner ta fenetre pour la confondre avec celle du dessous. ca sera pas une vraie transparence, mais ca y ressemblera. et tu pourras récuperer les clics normalement.

Reply

Marsh Posté le 15-11-2003 à 11:54:32    

Oui je vois ce que tu veux dire mais je suis pas sur que ca soit très facile : ce que veux c'est rendre transparent le fond d'un edit, mais qu'on continue à voir le texte. Ca va devenir trop compliqué pour juste une feature-gadget.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 20-11-2003 à 14:04:36    

http://msdn.microsoft.com/library/ [...] ibutes.asp
Y'a 4 parametres à SetLayeredWindowAttributes, t'as mis quoi au 4°?
As tu essayé de jouer avec la transparence? Si tu mets 0, ta fenêtre sera 100% transparente => pas de clic.
Si tu mets 1, a l'oeil on voit pas la diff, mais je pense que tu recevras les clics... A tester.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-11-2003 à 17:33:06    

En fait c'est pas avec le LWA_ALPHA que je joue, ça ça va, moi c'est le LWA_COLORKEY que j'utilise -> la couleur du fond de ma fenetre devient 100% transparente.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 21-11-2003 à 13:33:27    

Et tu peux pas la faire 99% transparente...,


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 22-11-2003 à 17:03:57    

HelloWorld a écrit :

Et tu peux pas la faire 99% transparente...,

Non. Je repete, les deux attributs (LWA_ALPHA et LWA_COLORKEY) sont independants. LWA_ALPHA sert à ajuster la transparence de l'ensemble de la fenetre, LWA_COLORKEY sert à rendre une couleur entièrement transparente. Or moi ce que je veux c'est que le fond de ma fenetre soit transparent, mais qu'on continue à voir ce qui est ecrit dedans -> donc je rends la couleur du fond de la fenetre transparent.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 30-11-2003 à 14:22:53    

Ouai pas evident en effet. Si le mode colorkey est plus utilisé pour détourer une fenetre de forme zarb que pour la rendre en partie transparente, c'est pas pour rien.
Si ton edit est entouré de bouts de fenetre a toi, genre un dialogue, tu peux toujours essayer de faire un SetCapture() quand la souris va entrer sur ton edit, genre dans le OnMouseMove() de la fenetre qui contient ton edit, et ReleaseCapture() quand elle en sors, via des tests dans le OnMouseMove() de ton edit, mais c'est un peu porc comme méthode. Si quelqu'un voit qqch de mieux...

Reply

Marsh Posté le 19-11-2004 à 14:34:00    

R3g a écrit :

En gros, j'ai un éditeur de texte (une fenêtre toute con avec un EDIT dedans), et je voudrais que le fond soit transparent. J'ai trouvé à la faire en rendant la couleur de fond du contrôle transparente :

Code :
  1. SetWindowLong(hwndMain, GWL_EXSTYLE, WS_EX_LAYERED);
  2. SetLayeredWindowAttributes(hwndMain, RGB(255, 255, 255), LWA_COLORKEY);


Le fond de la fenêtre est bien transparent, et même trop : quand on clique dans la fenêtre, c'est la fenêtre en dessous qui reçoit le clic.
Donc ma question est simple : comment obtenir le même résultat tout en continuant à recevoir les clics ?


 
J'ai trouvé un exemlpe de code avec les API a utiliser mes sous WinDev pour faire cela. Tu peux peut etre t'en inspirer
 
http://freedev.windev.free.fr/PageCodeTransparence.htm

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed