Pd de cdc en mémoire :(

CoyoteVsBeepBeep Messages postés 41 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 3 mars 2006 - 5 janv. 2006 à 11:36
CoyoteVsBeepBeep Messages postés 41 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 3 mars 2006 - 5 janv. 2006 à 12:09
hello,
j'ai un petit soucis avec du graphisme.
j'ai une boite de dialogue dans laquelle je veux faire une petite animation (background + une animation par dessus)
j'ai 3 classes.
une classe pour ma boite de dial, une classe background et une classe animation.
dans la classe de ma boite de dial, je crée un timer pour dessiner le fond et l'animation toutes les x millisecondes.
dans ce timer, je prends le device context de ma fenetre, et je crée un contexte compatible en mémoire dans lequel je veux dessiner.
dans ce contexte en mémoire, je dessine le fond et mon animation.
ensuite, je recopie tout en meme temps a l'écran.
pour background et animation, je fais une initialization a partir du device contexte de ma fenetre: je crée des DC compatible en mémoire (variable membre) pour les initialiser avec le fond (qui sera fixe) en une image que je vais modifier au cours du temps (animation)

lorsque je fais tout ca, ben j'ai rien a l'écran.....
voila le code. je crois que mon explication est grave embrouillé.....

dans la classe de ma boite de dial, je crée un object background et animation que j'initialise de la maniere suivante:
CDC * pDC=GetDC();
background.Create(pDC);
animation.Create(pDC);
ReleaseDC(pDC);

dans ma classe background, j'ai:
Create(CDC * pDC)
{
CDCbackground.CreateCompatibleDC(pDC);
HBITMAP BMPbackground = LoadBitmap(AfxGetInstanceHandle(), n° ressource interne de mon bmp);
CDCbackground.SelectObject(BMPbackground);
}
dans ma classe animation:.
Create(CDC * pDC)
{
CDCAnimation.CreateCompatibleDC(pDC);
//je prepare toute mes images
HBITMAP BMPAnimation[0] = LoadBitmap(AfxGetInstanceHandle(), n° ressource interne de mon bmp);
HBITMAP BMPAnimation[1] = LoadBitmap(AfxGetInstanceHandle(), n° ressource interne de mon bmp);
HBITMAP BMPAnimation[2] = LoadBitmap(AfxGetInstanceHandle(), n° ressource interne de mon bmp);
.
.
//je selectionne la premiere
CDCAnimation.SelectObject(BMPAnimation[0] );
}

dans ma boite de dial, je crée un timer.
dans ce timer, je mets:

CDC * pDC=GetDC();
CDC memDC;
menDC.CreateCompatibleDC(pDC); //créer un contexte en memoire

//dessin du fond dans la mémoire
background.DrawBackGround(&memDC);
//dessin de l'animation dans la mémoire
animation.DrawAnimation(&memDC);

//recopie le context memoire sur l'écran
pDC->BitBlt(rcClient.left,rcClient.top,rcClient.Width(), rcClient.Height(), &memDC, SRCCOPY);
ReleaseDC(pDC);

le but étant de travailler dans la memoire et de tout recopier a la fin

dans ma classe background, j'ai
DrawBackGround(CDC * memdc)
{
CRect rcClient=GetClientRectangle();

memdc->BitBlt(rcClient.left,rcClient.top,rcClient.Width(), rcClient.Height(), &CDCbackground, SRCCOPY);
}
dans ma class animation, j'ai
DrawBackGround(CDC * memdc)
{
memdc->BitBlt(animation_position_x, animation_position_x, 32, 32, &CDCAnimation, SRCCOPY);
//je prepare ma prochaine image (index=variable membre)
index=(index+1)%16;
CDCAnimation.SelectObject(BMPAnimation[index] );
}



ps: si dans mon timer je ne passe pas par un contexte intermédiaire (memdc) et que je travaille directement dans pDC (contexte de ma fenetre) ca marche tres bien, mais j'ai un phénomene de flickering. mon image clignote et c'est pas tres beau parce que le fond et l'animation ne sont pas dessiné en meme temps

help, please......

1 réponse

CoyoteVsBeepBeep Messages postés 41 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 3 mars 2006
5 janv. 2006 à 12:09
pour aider a la compréhension voila les sources:

http://www.cppfrance.com/code.aspx?ID=35418
0
Rejoignez-nous