IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Conteneur transparent sur lequel on peut dessiner (hDC)


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut Conteneur transparent sur lequel on peut dessiner (hDC)
    Salut,

    Je développe une petit prog dans lequel j'extrait une icone avec l'API ExtractAssociatedIcon.

    J'aimerais dessiner cette icone dans un conteneur qui serait transparent.
    Seulement, le probleme c'est qu'evidemment, si par exemple je prends un userform et que je met BackStyle a transparent, j'ai beau dessiner sur le userform (avec DrawIconEx), je n'ai rien !

    Ma question est donc : existe t-il un conteneur possédant un hDC qui soit transparent de base mais sur lequel on peut dessiner et que seul le dessin soit non-transparent ?

    J'aimerais éviter les techniques de découpages des bords avec les regions, etc car ces techniques sont souvent lentes et imprecises.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Regarde du coté de SetLayeredWindowAttributes

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse.

    J'ai essayé mais le probleme est que ce que je dessine est égalent mis en transparence et est donc invisible si je met 0 d'opacité.

    Donc en fait, le probleme est le meme, comment dessiner une icone opaque sur un conteneur transparent ?

    Cordialement.

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Pas si tu utilises une couleur de transparence avec LWA_COLORKEY.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    En effet, ça marche pour un form mais par contre, ça ne s'applique pas a une picturebox, il me semblait pourtant que setLayeredWindowAttributes marchait aussi pour une PB.

    Enfin, la n'est pas le probleme : je ne veux pas avoir l'air de chipoter mais cette technique met une transparence une seule et unique couleur, ce gui est génant car ça ne prend pas en charge la transparence partielle.

    En fait, je pense que je n'arriverais pas a gerer la transparence partielle en VB sans passer par des icones d'un ListView.

    Je vais donc essayer de dessiner directement sur ma form mais simplement, l'icone devais renvoyer des evenements (click, ...) et ça risque d'etre vraiment lourd si je gere ça uniquement par la position du curseur dans la feuille pour voir si la souris est su le dessin. Auriez-vous une idée ?

    Merci

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Question :

    Qu'as tu exactement à "voir" au travers de ta picturebox ?

    Si tu n'as pas d'autre contrôles à "voir" en dessous, le problème me parait avoir une solution relativement simple.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Non je n'ai pas de controles, juste un arriere plan.

    J'ai bien pensé a copier l'arriere plan comme fond a chaque fois mais l'ennuie c'est que mes icones vont pouvoir etre déplacées et donc redessiner l'arriere plan a chaque fois va etre assez couteux (j'aimerais avoir un déplacement fluide).

    En fait, mon but étant de gerer des icones, je me suis penché sur l'utilisation d'un ListView sur lequel je pourrais manipuler l'arriere plan.

    J'ai trouvé une source ou on obtient le hDC du ListView via GetDC mais dans mon code on obtient bien le DC lais rien ne se dessine.

    Cordialement.

  8. #8
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par windob Voir le message
    En effet, ça marche pour un form mais par contre, ça ne s'applique pas a une picturebox, il me semblait pourtant que setLayeredWindowAttributes marchait aussi pour une PB.

    Enfin, la n'est pas le probleme : je ne veux pas avoir l'air de chipoter mais cette technique met une transparence une seule et unique couleur, ce gui est génant car ça ne prend pas en charge la transparence partielle.

    En fait, je pense que je n'arriverais pas a gerer la transparence partielle en VB sans passer par des icones d'un ListView.

    Je vais donc essayer de dessiner directement sur ma form mais simplement, l'icone devais renvoyer des evenements (click, ...) et ça risque d'etre vraiment lourd si je gere ça uniquement par la position du curseur dans la feuille pour voir si la souris est su le dessin. Auriez-vous une idée ?

    Merci
    Fait l'effort d'une recherche sur le forum avec SetLayeredWindowAttributes+picturebox
    => page 13 de la recherche : http://www.developpez.net/forums/sho...ght=picturebox

  9. #9
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Fait l'effort d'une recherche sur le forum avec SetLayeredWindowAttributes+picturebox
    => page 13 de la recherche : http://www.developpez.net/forums/sho...ght=picturebox
    Merci, en effet, j'avais vu ça après coup mais je me suis rendu compte que je n'arriverais sans doute pas a gere la transparence partielle par mes propres moyens.

    Alors que le controle Listview, gere la transprence partielle des icones il me semble. Pour l'instant je me dirige donc vers cette voie en ésperant pouvoir regler ce probleme de GetDC du Background du Listview.

    Si quelqu'un a une idée ou a déja réussi le faire ....

    Merci

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Beaucoup trop de choses restent assez floues !
    1)
    Seulement, le probleme c'est qu'evidemment, si par exemple je prends un userform et que je met BackStyle a transparent, j'ai beau dessiner sur le userform (avec DrawIconEx), je n'ai rien !
    Attends, là : un userform ? en VB6 ?
    C'est quoi, que tu appelles un UserForm ?
    2)
    comment dessiner une icone opaque sur un conteneur transparent
    dessiner est une chose... ajouter un contrôle contenant une image en est une autre ...
    ce qui m'inquiète plus encore est ceci :
    En effet, ça marche pour un form mais par contre, ça ne s'applique pas a une picturebox, il me semblait pourtant que setLayeredWindowAttributes marchait aussi pour une PB.
    complété par celà :

    Je vais donc essayer de dessiner directement sur ma form mais simplement, l'icone devais renvoyer des evenements (click, ...) et ça risque d'etre vraiment lourd si je gere ça uniquement par la position du curseur dans la feuille pour voir si la souris est su le dessin. Auriez-vous une idée ?
    Attends, là :
    a) s'il s'agit d'un dessin, je ne vois pas en quoi le fait qu'il s'agit d'une Form gênerait plus que s'il s'agissait d'une PictureBox !!! Dans les deux cas, le problème serait rigoureusement le même
    b) s'il s'agit d'un contrôle contenant une image : pareil (sauf que le click serait alors reconnu) : situation identique que le contrôle se trouve sur une Form ou sur une picturebox !!!

    J'ai l'impression de ce qu'en fait, tu es en train de "te chercher" sans savoir exactment ce que tu veux faire....

    3)
    Non je n'ai pas de controles, juste un arriere plan.
    et
    mais l'ennuie c'est que mes icones vont pouvoir etre déplacées et donc redessiner l'arriere plan a chaque fois
    Je ne comprends absolument pas !
    Que tu dessines ou que tu ajoutes un contrôle dans ta picturebox, tu ne touches absolument pas à son arrière plan !

    Bref... Nous allons tâcher d'aller plus vite ...

    Première question :
    Pourquoi souhaites-tu envoyer ton image dans un container ?
    1) si pour y dessiner : il te faut en effet une picturebox ou une Form (un hdc, quoi ...).
    Si l'arrière plan de cette picturebox ne contient pas de contrôle à voir en transparence mais seulement un fond à voir en transparence : pas de problème (la solution est simple) ==>> tu redessines la picturebox avec l'image de fond et tu y dessines ton dessin !!! opération de la plus grande simplicité !
    Mais alors : problème, de toutes façons, pour gérer ensuite les évènements de ce dessin (voir plus haut !!!)
    2) si pour y "coller" un contrôle : tu n'as alors absolument pas besoin d'une picturebox comme container ! Un simple Frame suffit (et je sais rendre un Frame totalement transparent, tout en conservant l'opacité de ce qu'il contient et en empêchant de cliquer "au travers"... un vrai Frame transparent, quoi) !
    Et dans ce cas : s'agissant de contrôles et non de dessins, ils répondront aux évènements d'un contrôle !!!

    Voilà ! j'ai fini mon baratin ...

    Il en résulte que, si tu veux une aide, il va te falloir exprimer ton besoin dans les détails, en exposant clairement TOUS (sans auucune exception) les tenants et les aboutissants... mais que nous te donnerons la solution correspondant à ton expression et non le mécanisme qu'il conviendrait de mettre en oeuvre pour parvenir à un résultat (ce mécanisme doit rester le seul fruit de TA pensée).

    Amicalement.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Beaucoup trop de choses restent assez floues !
    1)


    Attends, là : un userform ? en VB6 ?
    C'est quoi, que tu appelles un UserForm ?

    Autant pour moi, c'est un UserControl, j'ai confondu a force de voir ça dans des codes VBA !
    2)

    dessiner est une chose... ajouter un contrôle contenant une image en est une autre ...
    ce qui m'inquiète plus encore est ceci :


    complété par celà :



    Attends, là :
    a) s'il s'agit d'un dessin, je ne vois pas en quoi le fait qu'il s'agit d'une Form gênerait plus que s'il s'agissait d'une PictureBox !!! Dans les deux cas, le problème serait rigoureusement le même

    Le fait que ça soit une picturebox ou une form ne gene pas le dessin mais la mise en transparence via SetLayeredWindowAttributes

    b) s'il s'agit d'un contrôle contenant une image : pareil (sauf que le click serait alors reconnu) : situation identique que le contrôle se trouve sur une Form ou sur une picturebox !!!

    J'ai l'impression de ce qu'en fait, tu es en train de "te chercher" sans savoir exactment ce que tu veux faire....

    En effet, je suis encore en train de chercher car a chaque fois que j'aperçois un debut de solution, les problemes viennent

    3)

    et


    Je ne comprends absolument pas !
    Que tu dessines ou que tu ajoutes un contrôle dans ta picturebox, tu ne touches absolument pas à son arrière plan !

    Je veux dire que si je fais une fausse transparence en copiant l'arriere plans de ma form dans mon conteneur, alors il me faudra le recopier dans le conteneur a chaque déplacement du conteneur pour que l'effet de fausse transparence soit suivi.

    Bref... Nous allons tâcher d'aller plus vite ...

    Première question :
    Pourquoi souhaites-tu envoyer ton image dans un container ?
    1) si pour y dessiner : il te faut en effet une picturebox ou une Form (un hdc, quoi ...).
    Si l'arrière plan de cette picturebox ne contient pas de contrôle à voir en transparence mais seulement un fond à voir en transparence : pas de problème (la solution est simple) ==>> tu redessines la picturebox avec l'image de fond et tu y dessines ton dessin !!! opération de la plus grande simplicité !
    Mais alors : problème, de toutes façons, pour gérer ensuite les évènements de ce dessin (voir plus haut !!!)
    Je viens de répondre, comme mon icone sera déplacée, je ne peux pas me permettre de recopier l'arriere plan pendant le déplacement du conteneur puisque je souhait avoir un déplacement fluide

    2) si pour y "coller" un contrôle : tu n'as alors absolument pas besoin d'une picturebox comme container ! Un simple Frame suffit (et je sais rendre un Frame totalement transparent, tout en conservant l'opacité de ce qu'il contient et en empêchant de cliquer "au travers"... un vrai Frame transparent, quoi) !
    Et dans ce cas : s'agissant de contrôles et non de dessins, ils répondront aux évènements d'un contrôle !!!

    La méthode du Frame transparent m'intéresse, je vais rechercher dans cette voie mais peut-on y dessiner et faire en sorte que le dessin seul soit visible alors que tout le reste du fond soit transparent ? Si c'est possible, alors je me débrouillerait pour les évenements

    Voilà ! j'ai fini mon baratin ...

    Il en résulte que, si tu veux une aide, il va te falloir exprimer ton besoin dans les détails, en exposant clairement TOUS (sans auucune exception) les tenants et les aboutissants... mais que nous te donnerons la solution correspondant à ton expression et non le mécanisme qu'il conviendrait de mettre en oeuvre pour parvenir à un résultat (ce mécanisme doit rester le seul fruit de TA pensée).

    Amicalement.
    Pour récapituler plus simplement, en gros, je souhaite pouvoir afficher une icone de la meme façon que le bureau c'est a dire, gérant la transparence partielle de l'image et du label. (J'aurais peut-etre du le dire des le début ).

    J'espere que c'est plus clair maintenant.

    Cordialement.

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    C'est tout ce que tu as à expliquer ? et de cette "façon" ??

    Tes efforts sont sans aucun doute bien plus grands que ceux que j'ai moi-même faits !!!!

    Bon courage, donc... cogite bien...

  14. #14
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    C'est tout ce que tu as à expliquer ? et de cette "façon" ??

    Tes efforts sont sans aucun doute bien plus grands que ceux que j'ai moi-même faits !!!!

    Bon courage, donc... cogite bien...
    tu n'aurais pas oublié de lire ce qui est en gras dans la citation, des fois ...

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Je n'ai rien oublié du tout...

    Et toi ?

    Je te laisse l'aider, alors ...... fastoche, hein (s'il a su s'expliquer...)

    Si c'est à ceci que tu te réfères :

    La méthode du Frame transparent m'intéresse, je vais rechercher dans cette voie mais peut-on y dessiner et faire en sorte que le dessin seul soit visible alors que tout le reste du fond soit transparent ? Si c'est possible, alors je me débrouillerait pour les évenements
    regarde ce que j'ai mis en rouge

    puis relis-moi :

    Et dans ce cas : s'agissant de contrôles et non de dessins, ils répondront aux évènements d'un contrôle !!!
    A relire également : ce que j'avais écrit en 2)... toujours sans la précision attendue !

    Voilà ...

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Bon, je repars du début

    Je voudrais pouvoir creer une sorte de "groupe" composé d'un label et du dessin d'une icone (avec extractassociatedicon et drawiconex).

    Comme je voulais faire justement en sorte que le dessin et le label soient dand un meme "groupe", j'ai pensé a un usercontrol sur lequel le pose mon label et je dessine grace a sa propriété hDC.

    Ceci étant, je peux gerer la transparence du controle avec les propriétés maskcolor et maskpicture, simplment, ça ne me permet pas de gerer la transparence partielle.

    D'ailleurs, je pense que je n'arriverais pas a gerer la transparence partielle des icones moi-meme. C'est pourquoi j'ai pensé finalement a utiliser un ListView en mode Icon pour pouvoir afficher les icones comme je veux (avec gestion dela transparence partielle).

    Mais avec cette derniere solution (listview), ça marcherais bien si je pouvais acceder au hDc de l'arriere plan du Listview et c'est la qu'est mon probleme maintenant.

    Donc, j'ai cherché des solutions a ce probleme et j'ai trouvé des codes qui utilisent GetDC(Listview.hWnd) pour recupere un hDC. Simplement, je n'arrive pas a reproduire ce comportement, le hDC est bien récupéré mais rien ne se dessine dans le ListView.

    Avez-vous une solutions a ce dernier porbleme a me proposer ?

    Merci d'avance.

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    1) Je ne sais pas où tu veux en arriver avec ta ListView et ce "mic-mac"
    2) si tu partais d'icones (à toi, donc, ou transformées par toi) avec le "tour" "transparent", il suffirait de les insérer dans un contrôle image
    3) si tu tiens à partir d'icônes "extraites" et redessinées (ce qui leur fait perdre leur transparence), il y a une solution (sacrément "tirée par les cheveux") qui pourrait être envisagée, mais elle implique de connaître la couleur qui "entoure" la partie de ton icône qui doit rester visible. L'idée sera alors d'utiliser une PictureBox "tremplin" ....et de jouer avec cette pictureBox et avec le contrôle image que l'on fabriquerait à l'aide de la reconstitution de l'icône extraite.... Lourd ...Lourd... mais réalisable ...

    Ma conclusion : vaut mille fois mieux faire ou refaire tes icônes et leur donner la transparence à l'aide d'outils spécialisés, puis de les utiliser directement dans un contrôle image (solution 2).
    Si tu tiens à la solution 3, je te préviens : il va falloir que tu t'accroches sérieusement, y compris avec mon aide !!!

    Tiens ... quel silence ... on te t'entend plus ...

    J'ai quand même voulu m'amuser un peu à faire joujou avec des icônes extraites... j'y parviens, mais, comme je m'y attendais, c'est "tiré par les cheveux" et tu n'y comprendras pas grand chose, c'est à peu près certain ...

    Je suis donc en train de manoeuvrer de telle manière que tu n'auras aucun besoin de piger quoi que ce soit (juste à ajouter un module et à laisser faire).
    Tu peux donc rester avec tes extractions d'icônes, on va faire avec ...

    Et (cerise sur le gateau) : tu n'auras pas besoin de jouer à la bataille navale pour les déplacements car tu déplaceras une picturebox (donc fastoche)... je m'en occupe également, si tu le souhaites...

    Je continue ?

    Bon...

    Toujours pas là notre ami ...

    Je mets quand même la solution...

    Elle pourra en intéresser en effet d'autres...

    Je préviens toutefois :
    Je ne déposerai personnellement jamais de sources.
    Il convient donc, si ce qui suit intéresse, que quelqu'un prenne les initiatives qui lui paraîtraient utiles (celà ne me regarde absolument pas et n'est pas mon problème, que ce code parte ou non aux oubliettes...).

    A nos moutons maintenant :

    Ce qui suit permet de traiter tant les Icônes associées à un fichier que celles extraites d'un fichier d'icônes (j'ai tenu à traiter les deux cas de figure).

    Je traite ici, donc, une icône de chaque catégorie et leur reconfère leur transparence, en vue de pouvoir les déplacer sans problème sur un fond.
    Le déplacement est également géré (bouton gauche enfoncé et glissement) pour chacune des deux icônes. L'examen du code vous permettra de voir comment, de façon claire...

    Donc :

    - Une Form avec une image de fond de votre choix dans sa propriété Picture
    - une picturebox nommée ucf, avec sa propriété index = 0
    - un module bas (vaut mieux ne pas tenter d'y analyser le code ucfoutien qui s'y trouve ! contentez-vous d'un copier-coller... celà vous évitera des maux de crâne)

    Ne vous préoccupez ni des dimensions ni de la position de la picturebox ucf(0) ... le code gèrera seul...

    Code pour la Form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Option Explicit
    Dim ancy, ancx As Integer
     
    Private Sub Form_Activate()
        With Me
          .AutoRedraw = True
          .ScaleMode = vbPixels
          .Move 0, 0, Screen.Width, Screen.Height
        End With
        With ucf(0)
          .Visible = True
          .AutoRedraw = True
          .ScaleMode = vbPixels
          .Move 100, 10, 100, 100
        End With
        Load ucf(1)
        With ucf(1)
          .Move 100, 100, 100, 100
          .Visible = True
          .ZOrder
        End With
        Dim mon_icone As Long
        '======================================================================================
        'bien ..... maintenant un exemple avec extraction d'icône associée à un fichier
        ' j'ai choisi l'icône de la corbeille
        mon_icone = ExtractAssociatedIcon(App.hInstance, "C:\recycled", 2)
        DrawIconEx ucf(0).hdc, 0, 0, mon_icone, 0, 0, 0, 0, DI_NORMAL
        DestroyIcon mon_icone
        bricolage ucf(0), ucf(0).Point(ucf(0).Width - 10, ucf(0).Height - 10)
        '=======================================================================================
        'Bien ... maintenant avec une icône extraite d'un fichier d'icônes
        'j'ai choisi l'icône numéro 10
        ExtractIconEx "shell32.dll", 10, mon_icone, ByVal 0&, 1
        DrawIcon ucf(1).hdc, 0, 0, mon_icone
        DestroyIcon mon_icone
        bricolage ucf(1), ucf(1).Point(ucf(1).Width - 10, ucf(1).Height - 10)
        '=======================================================================================
    End Sub
     
    ' ========================================= le traitement des glisser ======================================================
     
    Private Sub ucf_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 1 Then
       ancy = ScaleY(Y, 1, 3): ancx = ScaleX(X, 1, 3)
       ucf(Index).MousePointer = 15
      End If
    End Sub
     
    Private Sub ucf_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
      If Button = 1 Then
        ucf(Index).Move Int((ucf(Index).Left + ScaleX(X, 1, 3)) - ancx), Int((ucf(Index).Top + ScaleY(Y, 1, 3)) - ancy)
      End If
    End Sub
     
    Private Sub ucf_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
       ucf(Index).MousePointer = 0
    End Sub
    Code pour le module .bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Option Explicit
    Public Const DI_MASK = &H1
    Public Const DI_IMAGE = &H2
    Public Const DI_NORMAL = DI_MASK Or DI_IMAGE
    Public Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nIcons As Long) As Long
    Public Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long
    Public Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" (ByVal hInst As Long, ByVal lpIconPath As String, lpiIcon As Long) As Long
    Public Declare Function DrawIconEx Lib "user32" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
    Public Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long
    Public Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
    Public Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long
    Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Public Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
     
    Public Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End Type
    Public Type BITMAPINFOHEADER
        biSize As Long
        biWidth As Long
        biHeight As Long
        biPlanes As Integer
        biBitCount As Integer
        biCompression As Long
        biSizeImage As Long
        biXPelsPerMeter As Long
        biYPelsPerMeter As Long
        biClrUsed As Long
        biClrImportant As Long
    End Type
    Public Type RGBQUAD
        rgbBlue As Byte
        rgbGreen As Byte
        rgbRed As Byte
        rgbReserved As Byte
    End Type
    Public Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
        bmiColors As RGBQUAD
    End Type
    Public Const DIB_RGB_COLORS = 0&
    Public Const BI_RGB = 0&
    Public Const pixR As Integer = 3
    Public Const pixG As Integer = 2
    Public Const pixB As Integer = 1
     
    Public Sub bricolage(ByVal coucou As PictureBox, ByVal zombie As Long)
        Dim bitmap_info As BITMAPINFO
        Dim NBP() As Byte, NBBL As Integer, NBPL As Integer
        Dim rouge As Byte, vert As Byte, bleu As Byte, large As Integer, haut As Integer
        Dim X As Integer, Y As Integer, dx As Integer, fx As Integer, region0 As Long, region1 As Long
        With bitmap_info.bmiHeader
          .biSize = 40
          .biWidth = coucou.ScaleWidth
          .biHeight = -coucou.ScaleHeight
          .biPlanes = 1
          .biBitCount = 32
          .biCompression = BI_RGB
          NBBL = ((((.biWidth * .biBitCount) + 31) \ 32) * 4)
          NBPL = NBBL - (((.biWidth * .biBitCount) + 7) \ 8)
          .biSizeImage = NBBL * Abs(.biHeight)
        End With
        large = coucou.ScaleWidth
        haut = coucou.ScaleHeight
        ReDim NBP(1 To 4, 0 To large - 1, 0 To haut - 1)
        GetDIBits coucou.hdc, coucou.Image, 0, coucou.ScaleHeight, NBP(1, 0, 0), bitmap_info, DIB_RGB_COLORS
        cherchecoul zombie, rouge, vert, bleu
        For Y = 0 To haut - 1
          X = 1
          Do While X < large
            dx = 0: fx = 0
            Do While X < large
              If NBP(pixR, X, Y) <> rouge Or NBP(pixG, X, Y) <> vert Or NBP(pixB, X, Y) <> bleu Then Exit Do
              X = X + 1
            Loop
            dx = X
            Do While X < large
              If NBP(pixR, X, Y) = rouge And NBP(pixG, X, Y) = vert And NBP(pixB, X, Y) = bleu Then Exit Do
              X = X + 1
            Loop
            fx = X
            If dx < large Then
              If fx >= large Then fx = large - 1
              region1 = CreateRectRgn(dx + 0, Y + 0, fx + 0, Y + 1)
              If region0 = 0 Then
                region0 = region1
              Else
                CombineRgn region0, region0, region1, 2
                DeleteObject region1
              End If
            End If
          Loop
        Next Y
        SetWindowRgn coucou.hWnd, region0, True
        DeleteObject region0
    End Sub
     
    Private Sub cherchecoul(ByRef color As Long, ByRef r As Byte, ByRef g As Byte, ByRef b As Byte)
        r = color And &HFF&
        g = (color And &HFF00&) \ &H100&
        b = (color And &HFF0000) \ &H10000
    End Sub
    Voilà ....

    EDIT : Ah oui... un "tout petit détail" non dénué d'intérêt (pour les plus avertis) : l'action du bouton (pour par exemple le "glisser") concerne bien uniquement le dessin visible et pas tout le "rectangle" entier qui le contient ...(sachez en profiter).

  18. #18
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    J'ai une solution plutot simple et rapide s'il sagit d'icone extraites en Bmp. je met ca sur internet dans la journée.
    A plus tard

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Merci pour vos réponses.

    J'avais commencé par vouloir faire ta méthode de détourage manuelle avec les regions mais justement le probleme (je sais je suis un peu pointilleux) c'est que on ne peut pas appliquer de transparence partielle et l'effet n'est pas exactement ce que je recherche. Mais peut-etre suis-je trop exigeant...

    Pour ce qui est des controles Images, je suis d'accord que c'est évidemment plus simple de les utiliser puisqu'ils gerent tres bien la transparence. Mais le probleme c'est que ce sont des controles trop simplifiés qui ne possedent pas de propriétés hDC ni hWnd et je ne vois donc pas comment y placer une icone extraite par les API ExtractAssociatedIcon et cie. J'ai bien essayé en passant par une picturebox temporaire et ensuite de faire Image.Picture = PictureBox.Image. Mais évidemment, je prend le fond de la PB avec et donc le controle Image perd tout son intéret.

    Pour finir, je n'avance pas du tout sur les autres methodes donc je pense que je vais me resigner a utiliser la methode de détourage décrite par ucfoutu. Et par la meme occasion, faire une croix sur la gestion de la transparence partielle.

    Merci encore pour vos idées et réponses
    Cordialement

    PS :
    Tiens ... quel silence ... on te t'entend plus ...
    Désolé, je ne suis pas connecté sur le forum h24 et je sens comme une pointe de dédain dans ta remarque...
    Toutefois, merci quand meme de m'avoir répondu et d'avoir preté attention a mon probleme.

  20. #20
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Il n'y avait aucun dédain.

    Juste de l'étonnement de ne plus te voir suivre alors que j'avais besoin de t'entendre pour savoir dans quelle direction travailler utilement, c'est tout ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Créer un dessin sur lequel on effectuerait des actions
    Par Ph.denis dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 12/11/2006, 10h51
  2. Réponses: 3
    Dernier message: 26/05/2006, 00h06
  3. Réponses: 8
    Dernier message: 06/07/2004, 18h30
  4. [dessin] enregistrer un jpeg sur lequel j'ai dessiné
    Par fonta13 dans le forum Graphisme
    Réponses: 4
    Dernier message: 02/07/2004, 14h05
  5. Réponses: 1
    Dernier message: 23/02/2003, 06h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo