Rafraîchissement StretchBlt TransparentBlt [Résolu]

Messages postés
18
Date d'inscription
mardi 29 août 2006
Dernière intervention
16 septembre 2008
- - Dernière réponse : jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
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  
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
3
Merci
Bonsoir,

essaye alors de le remplacer dans un premier temps (pour voir) par un Doevents...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de jmfmarques
Messages postés
18
Date d'inscription
mardi 29 août 2006
Dernière intervention
16 septembre 2008
0
Merci
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  
Commenter la réponse de ajdw
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
0
Merci
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 !!!
Commenter la réponse de jmfmarques

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.