BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 2012
-
17 déc. 2003 à 21:16
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
8 janv. 2004 à 17:24
Salut,
Je fait plusieurs occurence de
MoveTo + LineTo sur un CDC.
Est-il possible d'optimiser LineTo avec une autre fonction ?
J'avais essayé en passant part un MetaFile et en le copiant après dans mon CDC - > Hyper Lent.
En fait je fait un OScillo. Pour avoir un effet persistant, j'efface la courbe précedente et affiche ensuite la nouvelle.
J'ai environs un millier de Ligne en fait dans certains cas : 4000 lignes
Effacement OldLigneVoie1 // 1000 Lignes en tout
Effacement OldLigneVoie2 // 1000 Lignes en tout
Affichage NewLineVoie1 // 1000 Lignes en tout
Affichage NewLineVoie2 // 1000 Lignes en tout
Je suis sur qu'on peut mieux faire.
J'avais essayé d'effacer entierement l'ecran et de redessiner dessus la nouvelle courbe, mais ca donne un effet de clignotement et on ne voit pas la fin de la courbe (ce qui est logique)...
BitBlt ? j'y pensai aussi, mais selon moi c'est un peu comme les MetaFiles, en plus cela risque la aussi de donner un effet de clignottement (d'autant que parfois les données à afficher peuvent arriver très lentement...)
Voilà si quelqu'un à une idée ....
(BruNew par exemple ?? ) je sais qu'il traine partout et qu'il est toujour de bon conseil...
Merci pour ton jeu d'instruction ASM.
Je pensais d'ailleur utiliser l'assembleur pour ecrire directement dans le CDC, mais je sais pas vraiment comment faire. en DELPHI, et BORLAND il existe apparament une fonction ScanLine permettant de recuperer l'adresse du CDC et d'ecrire directement (???) dedans ...
VOilà si quelqu'un à des conseils, merci à tous....
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 17 déc. 2003 à 23:19
Salut,
je suis vraiment deborde en ce moment.
Tu as regarde ma source qui ecrit en sinusoidal, c'est ni MFC ni LineTo mais le principe est le meme. Trace sur un memorydc et plaque en 1 fois avec BitBlt. Pas besoin d'effacer avant puisque tu plaques la surface a chaque fois, aucun scintillement.
BruNews, ciao...
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 8 janv. 2004 à 14:24
Voila....
bonne année a tous...
J'ai essayé ca fonctionne sauf .....
Je voudrais ne pas ecraser l'image mais coller l'image par dessus. Le probleme, c'est qu'en initialisant mon CBitmap, je crée l'image complete.
par exemple j'ai une courbe en tache de fond, et j'aimerai y appliquer un quadrillage avec BitBlt. est-il possible de rendre toutes les zones du CBitmap transparente mise a part les traits et les lignes du quadrillage ????
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 8 janv. 2004 à 17:24
voici une méthode pour dessiner en transparence
utilisation d'un masque de l'image à insérer :
- image noir et blanc
- un pixel noir si le pixel correspondant de l'image est à afficher
- un pixel blanc si le pixel correspondant de l'image est transparent
ET entre 2 DC : hdcDest = hdcDesT ET hdcSrc
Blt(hdcDest, 0, 0, cx, cy, hdcSrc, 0, 0, SRCAND)
OU entre 2 DC : hdcDest = hdcDesT OU hdcSrc
Blt(hdcDest, 0, 0, cx, cy, hdcSrc, 0, 0, SRCPAINT)
5 DC :
dcBack : fond
dcInsert : image à insérer
dcMask : masque positif de l'image (noir pour les pixels à afficher)
dcFinal : image finale
dcTemp : dc temporaire
Blt(dcTemp, dcMask, NOTSRCCOPY) dcTemp = NOT dcMask (masque négatif)
Blt(dcTemp, dcInsert, SRCAND) dcTemp = dcTemp ET dcInsert
Blt(dcFinal, dcBack, SRCCOPY) dcFinal = dcBack
Blt(dcFinal, dcMask, SRCAND) dcFinal = dcFinal ET dcMask
Blt(dcFinal, dcTemp, SRCPAINT) dcFinal = dcFinal OU dcTemp
toutes les opérations ne sont pas à faire à chaque fois (on peut optimiser)
- si le bitmap à insérer est toujours le meme, les 2 premiers Blt ne sont
à faire qu'une fois à l'init
- le dcBack peut être écrasé s'il ne sert à rien après (au lieu d'en faire une
copy).
--------------------------------------------------
opération sur les couleurs :
couleur ET noir = noir
couleur ET blanc = couleur
couleur OU noir = couleur
couleur OU blanc = blanc
ex avec 16 couleurs :
0 : noir
9 : rouge
C : bleu
D : violet
F : blanc
image de fond (bleu):
C C C C C
C C C C C
C C C C C
C C C C C
image à insérer (rectangle rouge, avec violet comme couleur transparente) :
D D D D D
D 9 9 9 D
D 9 9 9 D
D D D D D
masque positif et négatif :
F F F F F 0 0 0 0 0
F 0 0 0 F 0 F F F 0
F 0 0 0 F 0 F F F 0
F F F F F 0 0 0 0 0
--------------------------------------------------
solution 1 :
(insert OU maskPos) ET (fond OU maskNeg)
F F F F F C C C C C C C C C C
F 9 9 9 F C F F F C C 9 9 9 C
F 9 9 9 F C F F F C C 9 9 9 C
F F F F F C C C C C C C C C C
--------------------------------------------------
solution 2 :
(insert ET maskNeg) OU (fond ET maskPos)
0 0 0 0 0 C C C C C C C C C C
0 9 9 9 0 C 0 0 0 C C 9 9 9 C
0 9 9 9 0 C 0 0 0 C C 9 9 9 C
0 0 0 0 0 C C C C C C C C C C
j'espère que c'est clair, sinon le mieux c'est de faire un dessin à la main en testant les opérations logiques