Rafraîchissement StretchBlt TransparentBlt

Résolu
ajdw Messages postés 17 Date d'inscription mardi 29 août 2006 Statut Membre Dernière intervention 16 septembre 2008 - 11 sept. 2008 à 18:10
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 11 sept. 2008 à 21:59
Bonjour à tous,

J'ai fait un UserControl qui contient plusieurs images. Le truc, c'est que j'essai de réaliser une transparence de mon contrôle pour afficher ce qu'il y a sur son Parent. Jusqu'ici, tout va bien.

Grâce à StretchBlt et TransparentBlt, j'arrive à mon résultat. Cependant, il y a un hic : ca ne fonctionne que s'il y a un MsgBox qui s'affiche pendant la fonction.

Pouvez-vous m'aider SVP ? Je pête un plomb là-dessus. Je sais que c'est un prob de raffraîchissement mais je ne vois pas comment y remédier sans avoir à utiliser un MsgBox.

Voici le code :
Public Sub Mettre_En_Fond_Transparent()

    '******************************* Partie d'initialisation de l'image de fond ***********************
    'Avant de faire un transparent, il nous faut prendre ce qui apparaît derrière le LabelMust
    Dim Cnt As Variant

    UserControl.BackStyle = 0   'Rend le fond transparent, je ne peux pas le mettre par défaut car cela annule _
                                    l'affichage de mon Label
   
    PtFond.Cls      'PtFond est le PictureBox servant de tampon entre la source et la destination
    UserControl.Cls
    EventEnabled = False     'Annule tous les événements Resize lié à ce contrôle
    i = UserControl.Height
    UserControl.Height = i * 2 + 200    'Nécessaire car si les éléments sources et destination ne sont pas visible _
                                            cela ne marche pas

    For Each Cnt In UserControl.Controls    'là, je déplace tous les controls du UserControl hors-zone de manipulation
        On Error Resume Next
        Cnt.Top = Cnt.Top + i
    Next
   
    PtFond.Top = i      'Je m'assure que le PictureBox soit bien visible
    PtFond.ZOrder (0)
   
    MsgBox "Juste avant de faire la capture. Left : " & UserControl.Extender.Left & " , Top : " & _
        UserControl.Extender.Top        'Et voilà le MsgBox que je voudrai éliminer
   
    'ModX et ModY représentent respectivement Screen.TwipsPerPixelX et Screen.TwipsPerPixelY
    'Capture du fond du control
    StretchBlt PtFond.hDC, 0, 0, UserControl.Width / ModX, UserControl.Height / ModY, _
        UserControl.Parent.hDC, UserControl.Extender.Left / ModX, UserControl.Extender.Top / ModY, _
        UserControl.Width / ModX, UserControl.Height / ModY, SRCCOPY

    UserControl.BackStyle = 1
   
    'Renvoi de l'image sur le fond du UserControl
    StretchBlt UserControl.hDC, 0, 0, UserControl.Width / ModX, UserControl.Height / ModY, _
        PtFond.hDC, 0, 0, UserControl.Width / ModX, UserControl.Height / ModY, SRCCOPY

    UserControl.Height = i  'On ramène à la taille définie le UserControl
    EventEnabled = True     'On revalide l'événement Resize
   
    For Each Cnt In UserControl.Controls
        On Error Resume Next
        Cnt.Top = Cnt.Top - UserControl.Height
    Next
   
    PtFond.Top = UserControl.Height
   
End Sub

Voilà, là, je m'apprête à essayer de faire sans intermédiaire en déplaçant directement le UserControl. Mais j'aimerais quand même comprendre pourquoi ce cas de figure ne fonctionne pas et comment y remédier.

Merci d'avance à tout ceux qui vont essayer.

Un code et ça repart  

3 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 sept. 2008 à 21:00
Bonsoir,

essaye alors de le remplacer dans un premier temps (pour voir) par un Doevents...
3
ajdw Messages postés 17 Date d'inscription mardi 29 août 2006 Statut Membre Dernière intervention 16 septembre 2008
11 sept. 2008 à 21:40
Eeeeenoooooooorme !!!!!

Super, je te remercie, ca règle définitivement mon problème.

J'ai juste un truc à te demander si ce n'est pas trop. Peux-tu m'expliquer le fonctionnement et l'utilité (mis-à-part ici pour régler mon prob) en quelques mots ?

Encore merci.

Un code et ça repart  
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 sept. 2008 à 21:59
Re,

un seul truc :
frapper doevents, sélectionner ce mot et appuyer bsur la touche F1 .... puis ... lire ce que t'en dit ton aide en lugne !!!
0
Rejoignez-nous