Superposition d'image sur un dessin [Résolu]

Signaler
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
-
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
-
Bonjour,


J'ai une picbox (en vb6) sur laquelle je dessine des formes, et j'aimerais pouvoir y superposer des images par dessus.
Ces images sont en fait des pions ronds, et je voulais savoir si c'était possible de les ajouter dans ma picbox sans enlever ce que j'ai dessiné à la main derrière (je veux afficher les pions ronds, mais pas avoir la forme rectangulaire au fond noir avec un pion au milieu qui me sert d'image.)

Est ce que quelqu'un connait une fonction qui permette de faire cela?
Est-ce possible de mettre cela en place même après avoir dessiné à la main sur la picbox?
Merci beaucoup.

9 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
111
Salut,

Si ton but est d'afficher une image avec une couleur de fond transparente (le noir ici en l'occurence apparement), utilise la fonction de l'API Windows TransparentBlt qui est faîte pour cà.
______________________________________
DarK Sidious
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
1
Bon, je viens de trouver une solution à mon problème (mais ça ne résoud pas le problème avec le transparentblt :/), j'utilise un bitblt, et je mets en mémoire avant de lancer mon programme l'image noir sur blanc de la forme que je veux rajouter (pour moi c'est des pions)

'API Windows
'Bit Blitting : Détourage d'une image. Sers ici pour créer un fond transparent des pions.
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Const SRCAND = &H8800C6
Private Const SRCPAINT = &HEE0086
Private Const SRCCOPY = &HCC0020

(et dans le programme, plus loin)
(picture_base contient l'image à superposer, picture_invert contient la forme que je veux à l'arrivée, et picture_map est la picturebox sur laquelle je veux coller le tout)

        BitBlt Picture_Map.hDC, X, Y, largeur, hauteur, Picture_invert.hDC, 0, 0, SRCAND
        BitBlt Picture_Map.hDC, X, Y, largeur, hauteur, Picture_base.hDC, 0, 0, SRCPAINT
        Picture_Map.Refresh

Voila, j'espère que ça pourra en aider d'autres, petite alternative à transparentblt si on connait l'image de la forme à afficher, et ça enlève ce problème de ne pas mettre l'image en mémoire :)
Merci à tous les deux qui m'avez aidé, et merci à x-smurf pour cette solution :)
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
1
Merci, ça marche impec, et le fichier sur les API, c'est presque comme un miracle tombé du ciel !!  : D
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
1
J'ai un problème cependant après, l'image est bien superposée, niquel, mais si je passe une fenêtre devant ma form, l'image qu'on a rajouté va disparaitre (les dessins faits à la main restent cependant visibles)
J'en conclus que le transparentblt superpose l'image, mais ne l'enregistre pas.
Quelqu'un connait la commande pour empêcher ce désagrément?
(Pareil si on minimise la fenêtre, le dessin est intact quand on réouvre la fenêtre, par contre ce qu'on a rajouté avec transparentblt a disparu).
Merci encore une fois :)
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
111
Salut,

Tu as plusieurs solutions pour palier à ce problème : tracer l'image finale du picture box dans l'événement paint de ce dernier, ou activer l'autoRedraw du picturebox.
______________________________________
DarK Sidious
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
1
Salut,
J'ai déjà essayé de voir avec autoredraw, si je l'active avant de faire le transparentblt, ça ne m'affiche rien, et si je l'active après, le problème reste le même.
Comment fait on pour l'enregistrer manuellement dans ce cas?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
111
Salut,

Arf, c'est vrai qu'il y a incompatibilité entre l'autoredraw et le transparentBlt, essaye avec :

Let Picture1.AutoRedraw = false
Call TransparentBlt(...)
Set Picture1.Picture = Picture1.Image
Let Picture1.AutoRedraw = true
______________________________________
DarK Sidious
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Bonsoir,


Nous sommes nombreux à nous y être cassé les dents ....


La "superposition" ne dessine rien dans la picturebox .

Si le résultat plait, il n'y a rien à faire : il faut redessiner tous les pixels de la couleur non définie comme "transparente".... puis donner à la propriété Picture la valeur de la poropriété image (bien sur).
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
1
Hmmm non, j'avais déjà essayé le set picture1.picture=picture1.image, ça m'efface l'image superposée.
Après, il reste la solution pixel par pixel, comme le souligne jmfmarques, mais c'est assez embêtant à programmer, et ça risque de prendre du temps à la fonction :)
Je pensais essayer bitblt à la place, j'ai vu un programme où ça marchait plutôt bien, seulement je n'arrive pas à recréer ce qui a été fait. (Et je pensais que bitblt faisait pareil que transparentblt, au niveau de l'écriture de la picture...)
Enfin bref, je vais continuer à chercher, merci pour tout, et si jamais vous trouvez une solution vous passe par la tête, faite moi signe ;-)