Text au dessus de tout mais transparent ....

Résolu
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012 - 31 juil. 2006 à 20:54
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012 - 1 août 2006 à 23:57
bonjour a tous

je souhaiterait écrire "bonjour" sur l'écran, (comme quand on lève le son dans un clavier multimédia...) j'aimerai qu'il n'y ai pas de "fond" sous le texte ...

je sais pas si j'ai été claire...

merci d'avance

13 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
1 août 2006 à 23:52
Pourquoi avec image ça marcherait mieux ?

peut-être parce que le temps de chargement de l'image est plus long ...

mais il y a un problème quand on teste dans l' IDE et qu'on réduit la fenêtre, on perd l'avantage du premier plan,

et on a l'impression que ça marche pas

mais si on travaille dans l'IDE en fenêtré et non pas en plein écran, ça marche

et en compilé, ça marche toujours.


Option Explicit


 Const LWA_COLORKEY = &H1

 Const LWA_ALPHA = &H2

 Const HWND_TOPMOST = -1

 Const HWND_NOTOPMOST = -2


 Const SW_HIDE = 0

 Const SW_NORMAL = 1

 Const SW_SHOW = 5

   

 Const GWL_EXSTYLE = -20

 Const WS_EX_LAYERED = &H80000

 

 Const SWP_NOSIZE = &H1

 Const SWP_NOMOVE = &H2

 Const SWP_NOACTIVATE = &H10

 Const SWP_SHOWWINDOW = &H40


 Const WM_NCLBUTTONDOWN = &HA1

 Const HTCAPTION = 2


 Dim Bool As Boolean

 Dim XX   As Long

 Dim YY   As Long

 Dim Ret  As Long

 Dim C1   As Long

 

 Private Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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

 Private Declare Function SetLayeredWindowAttributes Lib "user32"
(ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal
dwFlags As Long) As Long

 Private Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As
Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long,
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

 Private Declare Function GetForegroundWindow Lib "user32" () As Long

 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

 Private Declare Function GetDesktopWindow Lib "user32" () As Long

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

 Private Declare Function SendMessage Lib "user32" Alias
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As
Long, lParam As Any) As Long

 Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long


Private Sub Form_Load()

    Dim R As Long

   

    Label1.Move 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight

    Label1.ForeColor = vbRed

    Label1.FontName = "Arial"

    Label1.FontSize = 20

    Label1.FontBold = True

    Label1.FontItalic = True

    Label1.Caption = "Bonjour"


    C1 = RGB(128, 120, 120)

    Picture1.BackColor = C1

    Ret = GetDesktopWindow

    SetParent Picture1.hwnd, Ret


    ShowWindow Picture1.hwnd, SW_HIDE

    R = GetWindowLong(Picture1.hwnd, GWL_EXSTYLE)

    R = R Or WS_EX_LAYERED

    SetWindowLong Picture1.hwnd, GWL_EXSTYLE, R

    SetLayeredWindowAttributes Picture1.hwnd, C1, 0, LWA_COLORKEY

    ShowWindow Picture1.hwnd, SW_NORMAL

'   pour mettre le Texte en premier plan (optionnel)
    Me.Show

    SetWindowPos Picture1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE

    Me.Hide

   

End Sub


Private Sub label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Bool = True

    XX X: YY Y

    SetLayeredWindowAttributes Picture1.hwnd, 1, 0, LWA_COLORKEY

    SetLayeredWindowAttributes Picture1.hwnd, 0, 32, LWA_ALPHA

End Sub


Private Sub label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If Bool = True Then

       Picture1.Move Picture1.Left + X - XX, Picture1.Top + Y - YY

       End If

End Sub


Private Sub label1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Bool = False

    SetLayeredWindowAttributes Picture1.hwnd, C1, 0, LWA_COLORKEY
'   cette Ligne n'est plus nécessaire si présence du SetWindowPos:

'   SetParent Picture1.hwnd, Ret
End Sub


Private Sub Label1_DblClick()

    Unload Me

End Sub

Daniel
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
31 juil. 2006 à 22:20
il te suffit de découper une fenêtre de la forme de ton texte et de la mettre au premier plan (voir ma source nommée horloge système par exemple), ce qui est plus simple à faire que de dessiner directement sur le DC de l'écran !
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 juil. 2006 à 23:12
un Label dans une PictureBox rendue transparente et mise sur le bureau

déplacement possible par l'évênement MouseDown du Label

arrêt par Double Click


Dim Ret  As Long

Dim C1   As Long


Private Sub Form_Load()

    C1 = RGB(120, 120, 120)

    Picture1.BackColor = C1

End Sub


Private Sub Command1_Click()

    Dim R As Long

    Ret = GetDesktopWindow

    SetParent Picture1.hwnd, Ret

   

    ShowWindow Picture1.hwnd, SW_HIDE

    R = GetWindowLong(Picture1.hwnd, GWL_EXSTYLE)

    R = R Or WS_EX_LAYERED

    SetWindowLong Picture1.hwnd, GWL_EXSTYLE, &H80084

    SetLayeredWindowAttributes Picture1.hwnd, C1, 0, LWA_COLORKEY

    ShowWindow Picture1.hwnd, SW_NORMAL

    Me.Hide

   

End Sub


Private Sub Label1_DblClick()

    Unload Me

End Sub

Daniel
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
1 août 2006 à 10:31
C'est juste du texte que tu veux afficher ?
Utiliser un Label en lui mettant la propriété BackStyle à Transparent, ça ne te suffit pas ?

Molenn
0

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

Posez votre question
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 11:55
13557

DARKSIDIOUS
 > j'affiche plusieurs fois des textes différents... donc je me vois mal découper la feuille plusieurs fois... :s

Molenn> il faut que la feuille sois invisible avec un label transparent... donc c'est pas bon 

=278023 Gobillot> Ta reponse ME CONVIENS MAIS cepandant j'ai quand meme un petit souci, je voudrai que le texte sois au premier plan? (et si possible comment détecter le plein écran?)

big thx a tout les 3
0
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 11:57
ps: voici les déclarations oublié...


 


Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long


Const GWL_EXSTYLE = -20
Const WS_EX_LAYERED = 524288
Const LWA_COLORKEY = 1
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 août 2006 à 12:37
Bah quel est l'inconvénient de découper plusieurs fois la feuille ??? C'est bien ce que je fais avec mon horloge, et ca marche très bien !
0
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 12:58
tu la coupe toute les minute ? moi pour mon appli il se peut qu'elle se coupe toute les seconde ou meme toute les demi seconde (c'est a l'appui de certaine touhce) et je trouve ca un peu bizzar d'utiliser cette methode... pas toi ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
1 août 2006 à 14:02
C'est pourtant l'une des plus simple car ca reste une fenêtre que tu peux manipuler très facilement (mettre au premier plan, ne pas gérer le raffraîchissement, mettre une image à la place d'une simple couleur, dessiner dedans, etc.)

Maintenant, c'est sûr que la découpe prend un peu de temps, mais je ne suis pas sûr que la méthode de gobillot marche : ton texte apparaît-il bien tout seul à l'écran ? Car à ce moment là, oui ca méthode est sûrement meilleure (il te reste plus qu'à faire un SetWindowPos sur le picturebox pour la mettre au premier plan). Cependant, j'ai un gros doute car en théorie en rendant le picturebox transparent, ca devrait aussi rendre transparent tout les contrôles qui sont contenus dedans !
0
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 14:37
la methode de gobillot marche, il y a en effet du texte tout seul a l'écrant mais j'ai déjàa essayé SetWindowPos et ca ne fonctionne que si il y a une image dans le picturebox je sais pas pk ...
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
1 août 2006 à 16:07
Salut,

ma méthode marche très bien, elle est opérationnelle depuis un bon moment

le texte apparaît normalement et seule la PictureBox est transparente

on peut même se passer du Label et écrire directement dans la PictureBox mais c'est moins pratique.


que veux tu dire par mettre en premier plan ?
<strike>le texte est sur le bureau, on peut le mettre sur une fenêtre pendant le déplacement mais dès qu'on clique sur la fenêtre,

le texte disparaît derrière ... il est bien fait pour être sur le bureau et non pas sur une autre fenêtre.
</strike>

je viens de rajouter SetWindowPos sur la PictureBox et ... ça marche !!!

le Texte reste bien en premier plan

Daniel
0
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 22:39
re, ben pour moi quand j'utilise setwindowpos ca fonctionne uniquement si la picturebox contient une image...
0
cs_kalif Messages postés 362 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 24 août 2012
1 août 2006 à 23:57
bien vu!
0
Rejoignez-nous