[MFC] Copie de CDC [Résolu]

Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 31 janv. 2004 à 20:56 - Dernière réponse : Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention
- 21 sept. 2004 à 15:00
Bon, voila, j'utilise 2 images dans ma MFC (SDI) que j'affiche en 'fond' de mon document...
Pourquoi 2 images ? Parce que j'ai mon image source (celle d'origine) et puis celle que j'utilise 'courrament' (en fond quoi.... je rajoute des trucs par dessus...)

Donc jusque la, tout va bien ... le problème c'est que je voudrais 'optimiser' un p'tit peu mon code ... a savoir qu'a l'initialisation de mes images .... je réalise 2 fois la meme opération ... a savoir :
[Lecture de mon image dans img]
// Pointeurs sur mon image 'courante'
CBitmap* pbmOffScreen = new CBitmap();
CDC* pdcOffScreen = new CDC();

// Pointeurs sur l'image 'source'
CBitmap* pbmSource = new CBitmap();
CDC* pdcSource = new CDC();

Pixel pix;

// Initialisation des pointeurs d'image
pbmOffScreen->DeleteObject();
pbmOffScreen->CreateCompatibleBitmap(pDC, img->w, img->h);
// Note : la largeur/hauteur de l'image sont accessible via img->w et img->h (des fois que vous auriez pas compris :p)

pdcOffScreen->DeleteDC();
pdcOffScreen->CreateCompatibleDC(pDC);
pdcOffScreen->SelectObject(*pbmOffScreen);

// Deja la, on fait cette partie en 'double'.... 
pdcSource->DeleteDC();
pdcSource->CreateCompatibleDC(pDC);
pdcSource->SelectObject(*pbmSource);

pbmSource->DeleteObject();
pbmSource->CreateCompatibleBitmap(pDC, img->w, img->h);

for(int i=0; iw; i++)
{
for(int j=0; jh; j++)
{
pix = img->pixels[i + j*img->w];
pdcOffScreen->SetPixel(CPoint(i,j), RGB(pix.R,pix.G,pix.B));
// On fait ici aussi ca en 'double' ....
pdcSource->SetPixel(CPoint(i,j), RGB(pix.R,pix.G,pix.B));
}
}


Donc voila.... je me demandais s'il n'existait pas un constructeur par copie de CDC (j'ai regardé ... il n'y a pas l'air d'y en avoir..) ou un truc qui permettrait de 'dupliquer rapidement' un CDC dans un autre... sans avoir a se l'initialiser en meme tps que le premier....

(en espérant avoir été clair .... ^^;;; )
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 6 févr. 2004 à 00:10
3
Merci
pDCDest->BitBlt(0, 0, cx, cy, pDCSrc, 0, 0, SRCCOPY);

recopie le contenu de pDCSrc dans pDCDest.

Merci ymca2003 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ymca2003
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 6 févr. 2004 à 06:52
0
Merci
yep .... j'a v trouvé (a force de chercher ^_^) ... par contre c vrai ke j'a v pas pensé a mettre la solution ....
Merchi qd meme =)
Commenter la réponse de Atmaweapon
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 21 sept. 2004 à 14:27
0
Merci
Je sais pas si ca va t'etre utile puisque j'utilise une lib annexe pour la lecture/utilisation d'images : www.libsdl.org
Si tu utilises également SDL, pas de pbs a ce que je mette le code si tu veux...
Commenter la réponse de Atmaweapon
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 21 sept. 2004 à 14:58
0
Merci
Pour afficher ton image, il faut que tu ailles dans ton Handler d'affichage (méthode onPaint() ou onDraw() ) et que tu fasses par exemple :

void MonProjetView::OnDraw(CDC* pDC)
{
if(blit_needed)
pDC->BitBlt(10, 20, pbmOffScreen->GetBitmapDimension().cx, pbmOffScreen->GetBitmapDimension().cy, &pdcOffScreen, 0, 0, SRCCOPY);
}


Attention : cela suppose qu'on ait comme attribut a la classe courante :
CDC *pdcOffScreen ; // dans l'exemple précédent, on travaille avec un attribut au lieu d'une variable déclarée dans la méthode (virer la déclaration de pdcOffScreen
CBitmap *pbmOffScreen ; // idem
bool blit_needed = false; // Va valoir 'true' une fois qu'on aura 'rempli' l'OffScreen ... a la suite de l'exemple précédent par exemple...

-> Ca va afficher l'image chargée en se placant en laissant 10 pixel sur la gauche et 20 pixel par rapport au haut de la fenetre

Pour enregistrer dans un fichier, bah ca doit exister.. mais j'ai pas les fonctions sous la main ...
'Au pire' tu fais un fichier raw (tous les pixels a la suite les uns des autres) ou tu va récupérer le format de fichier bmp qui est pas compliqué (un entete puis les pixels a la suite les uns des autres) ...
Commenter la réponse de Atmaweapon
Atmaweapon 50 Messages postés dimanche 28 décembre 2003Date d'inscription 11 avril 2006 Dernière intervention - 21 sept. 2004 à 15:00
0
Merci
EDIT : c'est pdcOffScreen et non &pdcOffScreen (dans l'appel a la méthode BitBlt() ) ... on travaille avec des pointeurs...
Commenter la réponse de Atmaweapon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.