TigWdz
Messages postés8Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention24 janvier 2005
-
2 janv. 2005 à 15:15
TigWdz
Messages postés8Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention24 janvier 2005
-
7 janv. 2005 à 21:31
Bonjour, je voudrais faire du surlignage dans une bitmap. Je m'explique : J'ai une bitmap qui représente du texte, et je veux, à la manière d'un marqueur fluo, surligner des lignes du texte, en semi transparence. Comment faire ?
Je pense qu'il faut utilmiser AlphaBlend. J'arrvie a rendre ma bitmap semi transparente (ce qui n'est pas le but), mais je n'arrive pas a faire un rectangle de couleur semi transparent dans ma bitmap.
Mon code : (que j'ai plus attrapé sur le net à la base, au quelle j'ai essayé de bidouillé de la transparence)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 2 janv. 2005 à 15:37
Ce que je te conseille : travailler dans un DC temporaire qui contient l'image en fond, et la couleur de surlignage sur tout l'image, ainsi, tu n'aurais plus qu'à copier la zone voulue avec BitBlt par exemple.
_______________________________________
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 2 janv. 2005 à 16:20
Ben tout d'abord tu copie ton image dans le DC temporaire. Ensuite, tu crée un nouveau DC temporaire qui contient uniquement la couleur de transparence en fond.
Tu applique le DC temporaire de la couleur de surlignage sur le DC temporaire contenant le fond à l'aide de la fonction AlphaBlend sur toute l'image, et tu détruit le DC temporaire contenant la couleur de fond.
Tu obtiens alors un DC temporaire avec l'image surlignée en semi-transparence, et tu n'as plus qu'à copier la partie de l'image que tu veux sur ton image de destination selon les coordonnées du surlignage.
Ainsi, ca évite de devoir appeler trop souvent AlphaBlend : si tu modifie ton surlignage souvent, tu n'as qu'à copier le bout d'image correspondant, et non recalculer toute la semi-transparence avec la couleur !
_______________________________________
TigWdz
Messages postés8Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention24 janvier 2005 2 janv. 2005 à 17:19
Bon je débude dans le domaine alors je metrise pas trop la chose. Pourquoi cela ne fonctionne pas ? (le surlignage n'apparait pas dans mon imgae)
NB : dans a la derniere ligne quand je remplace &memDC par &TempImgDC ou &TempClrDC (pour voir a quoi ressemble ces DC) rien ne s'affiche, ils sembles vides.
NB : je dessine dans une child frame d'une appli MDI
// on copie le DC couleur en transpance sur le DC temp image
TempImgDC.AlphaBlend(xDest, yDest, size.x, size.y, &TempClrDC, xDest, yDest, size.x, size.y, blendF);
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 2 janv. 2005 à 17:26
Je ne sais pas si ca vient de là (tout dépend des coordonnées en fait), mais pour l'appel à l'AlphaBlend, je te disais d'appliquer la semitransparence à tout l'image et non uniquement à un bout, donc fait ceci :
// on copie le DC couleur en transpance sur le DC temp image
TempImgDC.AlphaBlend(0, 0, size.x, size.y, &TempClrDC, 0, 0, size.x, size.y, blendF);
_______________________________________
// pour afficher le DC temporaire contenant une copie de l'image
pDC->BitBlt(xDest, yDest, size.x, size.y, &TempImgDC, org.x, org.y, SRCCOPY);
ou
// pour afficher le DC de la couleur de surlignage (qui devarait être jaune)
pDC->BitBlt(xDest, yDest, size.x, size.y, &TempClrDC, org.x, org.y, SRCCOPY);
pour voir a quoi reseemblent les DC temporaire, rien ne s'affiche ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 2 janv. 2005 à 17:54
Malheureusement, je ne vais pas pouvoir t'aider plus : je suis un programmeur VB, et je suis débutant en C++ : je suis beaucoup moins à l'aise sous VC++ pour faire du graphisme ! Je laisserais donc cette question à ceux qui passent par là et qui connaissent la réponse. Je ne peux que te guider dans l'algorithme à choisir.
_______________________________________
tu associes la bitmap hBitmap
au DC memDC
.
Une chose que tu dois savoir : chaque DC doit avoir une bitmap unique
associée pour pouvoir manipuler son contenu. Tu doit donc créer pour
chaque DC une nouvelle bitmap avec la fonction CreateCompatibleBitmap
avant de pouvoir effectuer des opérations dessus.
De plus, tu dois pouvoir utiliser les capacités de la fonction AlphaBlend
où (l, t
) et (r, b
) sont les coordonnées respectives des coins gauche-haut et droit-bas du rectangle que tu veux surligner. Dans ce cas, Tu créer avec CreateCompatibleBitmap une bitmap de la même taille que l'image source hBitmap
que tu associes à LigneDC et que tu rempli avec la couleur de surlignage en utilisant FillRect
sur toute l'image.
Voilà ! J'espère que ça marchera (en tout cas, en théorie, c'est a priori ça).