Double buffering sur une CDialog (dessin sous MFC)

Signaler
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011
-
Messages postés
41
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
3 mars 2006
-
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
}

1 réponse

Messages postés
41
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
3 mars 2006

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+