Double buffering sur une CDialog (dessin sous MFC)
jul39dole
Messages postés117Date d'inscriptionmardi 22 juillet 2003StatutMembreDernière intervention21 janvier 2011
-
8 janv. 2006 à 13:44
CoyoteVsBeepBeep
Messages postés41Date d'inscriptionjeudi 16 juin 2005StatutMembreDerniè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:
Double buffering sur une CDialog (dessin sous MFC)
CoyoteVsBeepBeep
Messages postés41Date d'inscriptionjeudi 16 juin 2005StatutMembreDerniè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();