Double buffering sur une CDialog (dessin sous MFC)

jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011 - 8 janv. 2006 à 13:44
CoyoteVsBeepBeep Messages postés 41 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 3 mars 2006 - 9 janv. 2006 à 10:49
Bonjour, je dois dessiner sur une boite de dialogue modale en MFC. Pour résoudre le problème de "scintillement", j'ai appliqué le double buffering. Seulement, cela ne marche pas...et je ne vois pas où se situe le problème. Voici mon code :

void CDialogPlacement::OnPaint()
{
CPaintDC fdc(this); // device context for painting
//mise en place du double-buffering
CDC dc;
dc.CreateCompatibleDC(&fdc);
//on y ajoute un bitmap pour agrandir dc
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(&fdc, 200, 200);
CBitmap* OldBmp = dc.SelectObject(&memBmp);


//operation de dessin sur dc
CPen aPen, *oldPen;
CBrush *oldBrush;
aPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldPen=dc.SelectObject(&aPen);
oldBrush=static_cast<CBrush*>(dc.SelectStockObject(WHITE_BRUSH));
dc.Rectangle(0,0,200,20);
dc.SelectObject(oldPen);
dc.SelectObject(oldBrush);

//on bascule dc vers fdc
fdc.BitBlt(0,0,401+DEC_X,401+DEC_Y,&dc,0,0,SRCCOPY);
dc.SelectObject(OldBmp);
dc.DeleteDC();
memBmp.DeleteObject();
// Do not call CDialog::OnPaint() for painting messages
}
A voir également:

1 réponse

CoyoteVsBeepBeep Messages postés 41 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 3 mars 2006
9 janv. 2006 à 10:49
hello,
j'ai modifié 2 trucs sur ton code et ca marche:

deja je travaille pas dans la fonction OnPaint mais je crée un timer pour déssiner a intervalle régulier (regarde le dernier commentaire de ton source: // Do not call CDialog::OnPaint() for painting messages) et je fais:

CDC *pDC;

pDC=GetDC();

//mise en place du double-buffering
CDC dc;
dc.CreateCompatibleDC(pDC);

//on y ajoute un bitmap pour agrandir dc
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDC, 200, 200);
CBitmap* OldBmp = dc.SelectObject(&memBmp);


//operation de dessin sur dc
CPen aPen, *oldPen;
CBrush *oldBrush;
aPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldPen=dc.SelectObject(&aPen);
oldBrush=static_cast<CBrush*>(dc.SelectStockObject(WHITE_BRUSH));
dc.Rectangle(0,0,200,20);
dc.SelectObject(oldPen);
dc.SelectObject(oldBrush);


//on bascule dc vers fdc
//fdc.BitBlt(0,0,401+DEC_X,401+DEC_Y,&dc,0,0,SRCCOPY);
pDC->BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
dc.SelectObject(OldBmp);
dc.DeleteDC();
memBmp.DeleteObject();

ReleaseDC(pDC);

A+
0
Rejoignez-nous