scrincer
Messages postés18Date d'inscriptionmercredi 24 mars 2004StatutMembreDernière intervention 3 avril 2009
-
6 déc. 2006 à 02:29
leSaleGauSS
Messages postés148Date d'inscriptionsamedi 4 novembre 2006StatutMembreDernière intervention 4 décembre 2008
-
7 déc. 2006 à 21:21
je cherche un controle de picturebox ou tout autre moyen equivalent de rendre le fond d'une picturebox transparente... jai trouver un ocx mais le seul probleme cest que je me servait de la function .cls mais elle n'est pas pris en charge par le controle que jai telecharger... le but de tout sa est de superposer plusieurs layers pour faire une animation grace a bitblt. sans la fonction .cls rien ne bouge...
jai penser que peut etre quelqun aurait fait un controle semblabe pour faire un mmorpg 2d sans direct x, jai chercher mais sans succes
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 6 déc. 2006 à 08:02
Bonjour,
Il va te falloir être clair, ici :
On appelle une picturebox transparente une picturebox qui laisse voir, sur la totalité de sa surface, tout ce qui se trouverait sous elle. Ce qui veut donc dire qu'on ne verrait même plus l'image qu'elle pourrait contenir elle-même et qu'on verrait par contre les contrôles qu'on y aurait mis.
Parles-tu de celà ou d'autre chose ? (par exemple une picturebox contenant une image dont une partie seulement, une couleur donc, devrait être transparente, tout le reste devant apparaître)
Tu vois bien qu'il s'agit là de deux choses bien différentes et que (comme toujours) il est indispensable de bien définir les choses.
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009 6 déc. 2006 à 12:32
Dans une application de dessin ou de jeu, on peut parfois avoir besoin de copier des bitmaps avec une couleur de transparence.
L'utilisation de l'API BitBlt par définition copie des zones rectangulaires.
Il existe deux méthodes qui se différencient par l'utilisation du masque.
Avec un masque de type bitmap.
Dans ce cas là, il faut créer une image noir & blanc qui définie les zones opaques et les zones transparentes. Vous voyez sur l'image ci-dessus les deux images sources nécessaires :
<li>l'image de l'arbre
</li>
<li>le masque de l'arbre </li>
Le principe est simple grâce à l'utilisation des opérations ROP (raster operations). Déclarez l'API suivante avec ses constantes :
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
Cette méthode comporte un inconvénient majeur. Imaginez que vous ayez 200 bitmaps transparents, le nombre d'images a manipuler (et surtout à créer) est multiplié par 2 :
<li>une pour l'image
</li>
<li>une pour le masque </li>
Pour ne créer qu'une seule image, il faut créer le masque par le code.
Avec un masque type DC (par le code)
C'est un "tout petit peu plus" délicat. Déclarez les API suivants :
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32"_
(ByVal hdc As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long) _
As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Il faut dans un premmier temps créer un DC compatible avec l'écran :
hdcDC = CreateCompatibleDC(0)
Il faut savoir que ce DC sera par nature en noir & blanc (et c'est là, toute l'astuce). Puis dimensionner un bitmap compatible avec le DC et aux dimensions de l'image (ici 40 * 64 pixels) :
hMask = CreateCompatibleBitmap(hdcDC, 40, 64)
Puis faire prendre corps au bitmap en le sélectionnant :
hDummy = SelectObject(hdcDC, hMask)
Enfin, copier dans ce bitmap (qui sera noir & blanc) l'image source :
Tous les pixels qui ne sont pas blancs dans l'image source seront alors noirs. Enfin, il suffit de faire la même opération que précédemment pour créer notre blit transparent mais cette fois-ci avec notre masque en mémoire :
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 6 déc. 2006 à 12:49
Je/Nous te remerci(e/ons), Le Cancre, pour ces explications ...
Reste que (et je vais le démontrer en son temps) :
1) on peut dans certains cas utiliser la vraie transparence (la totale : celle qui laisse tout passer à travers...) à certaines fins d'animation (cette démonstration sera une surprise...)
2) en matière de transparence "partielle" (celle qui n'est pas la transparence d'une pictureBox, mais la transparence d'une couleur), il y a des méthodes bien plus éfficaces, bien plus rapides et bien plus précises que BitBlt et StretchBlt !
Je souhaiterais vraiment, pour répondre à Scrincer, qu'il définisse clairement son but (c'est nécessaire et ma réponse en dépendra )
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009 7 déc. 2006 à 13:33
salut jmfmarques,
j'ai hate de voir ta démo :)
de voir qu'elle api tu utilise pour faire une vraie transparence
sinon c'est dommage que Scrincer ne donne pas signe de vie car le sujet m'interesse
bonne continuation....++
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 7 déc. 2006 à 17:50
Salut Le Cancre,
Tu as raison d'être impatient.
Mais réfléchis un peu : la vraie transparence laisse voir tout ce qui "se trouve en dessous". En conséquence, une picture box transparente perdrait totalement sa propre image !
Alors ? A quoi celà servirait ?
Hé bé oui.... (et ce sera la la surprise : encore une fois plus une astuce qu'autre chose : on fait une fausse transparence ayant l'apparence d'une vraie transparence et... on s'en sert fort utilement dans certaines animations particulières ... tu verras ...)
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009 7 déc. 2006 à 18:35
Salut jmfmarques,
j'utilise cette fameuse astuce moi aussi "fausse transparence" avec l'api Bitblt dans une de mes sources, je colle une partie de l'arriere plan qui se trouve sur l'emplacement de ma picturebox, le rendu est pas mal...(fusion de 2images)
Depuis longtemps je cherche un moyen pour rendre un jeu transparent(ou faire une copie de l'image du jeu) ..de sorte qu'on puisse voir le bureau avec l'image du jeu en meme temps en transparence...c'est assez difficile à expliquer