[MFC] Copie de CDC

Résolu
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 - 31 janv. 2004 à 20:56
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 - 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 .... ^^;;; )

5 réponses

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

recopie le contenu de pDCSrc dans pDCDest.
3
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
6 févr. 2004 à 06:52
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 =)
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
21 sept. 2004 à 14:27
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...
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
21 sept. 2004 à 14:58
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) ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
21 sept. 2004 à 15:00
EDIT : c'est pdcOffScreen et non &pdcOffScreen (dans l'appel a la méthode BitBlt() ) ... on travaille avec des pointeurs...
0
Rejoignez-nous