Transparence

tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 - 21 mai 2007 à 16:38
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 22 mai 2007 à 19:44
Salut à tous,
Je souhaite rendre une couleur semi-transparente sur une de mes forms.
Ca fait des heures et des heures que je cherche et je n'ai pas trouvé.
J'ai trouvé comment rendre une form transparente ou semi-transparente à 50% ou autre, j'ai trouvé comment rendre une couleur totalement transparente, invisible de manière à faire des skins etc, MAIS
je n'ai pas trouvé comme rendre cette couleur transparente à 50% par exemple.
Voici le code que j'ai trouvé:
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const WS_EX_LAYERED = &H80000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long


Public Function WndSetOpacity(ByVal hWnd As Long, Optional ByVal crKey As Long vbBlack, Optional ByVal Alpha As Byte 255, Optional ByVal ByAlpha As Boolean = True) As Boolean
Dim ExStyle As Long
ExStyle = GetWindowLong(hWnd, GWL_EXSTYLE)
If ExStyle <> (ExStyle Or WS_EX_LAYERED) Then
ExStyle = (ExStyle Or WS_EX_LAYERED)
Call SetWindowLong(hWnd, GWL_EXSTYLE, ExStyle)
End If
WndSetOpacity = (SetLayeredWindowAttributes(hWnd, crKey, Alpha, IIf(ByAlpha, LWA_ALPHA, LWA_COLORKEY)) <> 0)
End Function

Quelqu'un saurait-il comment faire, en VB6?
Merci de votre aide

7 réponses

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
22 mai 2007 à 10:57
T'as question ne veux rien dire...

Une couleur n'est pas transparente !!!  une couleur sur ton ecran uniquement representé par un pixel ce pixel est iluminé par 3 composantes Rouge Vert Bleue. On peut donner une illusion de transparence en associant les composantes de deux couleurs.

En general on utilise un ratio de transparence ce qui donne :

Couleur3 = Couleur1 * ( 1 - Ratio) + Couleur2 * (Ratio)

Couleur1 = Fenetre
Couleur2 = Fond

Donc quand tu auras determiné tes sources tu auras ta couleur resultante. Il n'existe pas de fonction toute faite pour ce que tu veux faire. Il va falloir que tu recré le fond transparent sur ta propre fenetre.

E.B.
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
22 mai 2007 à 11:17
Ok je vois le pb:s
Serait-il possible dans ce cas, d'avoir juste la form semi-transparente, mais en gardant le contour (bouton fermer et icone, titre) non transparent? Vu que le code ci-dessus me permet de mettre la form totalement transparente..
Sans avoir (bien entendu) à associer 2 forms, avec une ayant une couleur transparente (donc avec les contours) et une autre entièrement transparente sans les contour encastré dans la 1ere.
TBBUIM
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 mai 2007 à 13:58
Salut,

Bin éventuellement un BitBlt pour récupérer une impression d'écran, puis dessin de la bonne partie de l'écran dans la fenêtre, puis AlphaBlend pour dessiner de manière transparente dessus...

Ou bien appliquer une formule comme le suggère EBArtSoft, et utiliser Get/SetDIBits pour faire les modifs.

Regarde peut être aussi son source sur les bitmaps.

Dans tout les cas, le gros souci est la récupération du fond... En effet, récupérer le contenu d'une fenêtre recouverte par une autre est d'après ce que j'en sais, très compliqué, voire impossible.
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
22 mai 2007 à 14:19
En effet, j'ai bien compris ce qu'il fallait faire et c justement ce que je voulais éviter :s

Il me parait qd mm bizarre qu'on puisse avec WndSetOpacity rendre toute une form semi-transparente avec les 10 lignes que j'ai écris plus haut et qu'on ne puisse pas par un stratagème quelconque se servir de cette dernière pr rendre uniquement l'intérieur de la fenêtre semi-transparente :s
Le pb, c'est que j'ai vu un code qui récupère le fond et donne un effet de transparence sur la form, mais qd on déplace la fenêtre, ça clignote horriblement! Et j'ai rien trouvé pour empêcher se clignotement en VB6.

TBBUIM
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 mai 2007 à 16:06
Une idée toute bête : si tu passe le handle de fenêtre de la zone cliente à ta fonction WndSetOpacity, ça plante ?

Tu dois pouvoir trouver ce handle via GetWindow, mais je sais pas si ce sera juste la première GW_CHILD de la form. Si tu as un VS, il y a spy++ qui permet de visionner les handle de fenêtres en les pointants à la souris, ce qui peut être sympa pour déterminer leurs hiérarchies.

(Au fait, GetLayeredWindowAttributes, c'est XP minimum)
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
22 mai 2007 à 16:11
La fonction WndOpacity, rend une fenêtre semi-transparente, elle marche nikel!
Il suffit simplement de lui passer Me.Hwnd
Mais ça rend TOUTE la fenêtre semi-transparente, mm le contour, les boutons de la fenêtre de dialog etc!!! tout
moi je voudrais rendre semi-transparent juste le fond de la fenêtre, sans les controles et le contour... :(

TBBUIM
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 mai 2007 à 19:44
merci d'éviter les MP....

pas la possibilité de t'aider mais bon courage ;)
une piste tout de même...
tel quel (MP), ta demande ne me semble pas possible.
il faudrait plutôt attacher (setparent) tes contrôles concernés à une form invisible ET transparente, et déplacer cette form selon le déplacement et le resize de la form parent (subclassing)

cela dit tu seras embêté pour le focus

++
0
Rejoignez-nous