Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DOUBLE BUFFERING (MFC)


Information sur la source

Description

Cliquez pour voir la capture en taille normale
Application qui Gère le Double-Buffering...

L'Effet (très Génant) de Scintillement lors des Opérations de Dessin
peut être Résolu simplement par l'Ajout d'un Double-Buffer !

Cette Technique de Double-Buffering est Inserée dans la Fonction OnDraw()

Voyez Plutôt...
1) Lancer le .exe
2) Faites Cliquer-Glisser pour Déplacer la Vue (avec le Clique Gauche)
L'Image Scintille. (Il n'y a pas de Double-Buffering)
3) Activez le Double-Buffering (Touche F5)
4) Faites Cliquer-Glisser pour Déplacer la Vue (avec le Clique Gauche)
L'Image NE Scintille PAS. (VIVE le Double-Buffering)
 

Source

  • /////////////////////////////////////////////////////////////////////////////
  • // CDFView drawing
  • //
  • // Fonction de Dessin
  • // Le Double-Buffering agit ici !!!
  • //////////////////////////////////////
  • void CDFView::OnDraw(CDC* pDC)
  • {
  • // Ajouter par AppWizard...
  • //CDFDoc* pDoc = GetDocument();
  • //ASSERT_VALID(pDoc);
  • //mise en place du double-buffering ...
  • CDC DC2; // Création d'un DC qui servira de Tampon pour nos Opération de Dessin
  • DC2.CreateCompatibleDC(pDC); // Création du Context de Périférique Compatible avec notre Ecran
  • CDC* pDC2=&DC2; // On affecte à un Pointeur l'Adresse du Tampon ( au cas où le Double-Buffering serait Activé !!
  • // Récupération de la Taille Zone Client...
  • CRect rcClient;
  • GetClientRect(rcClient);
  • // Convertir en Zone Logique Conrespondante...
  • CRect LogicRect;
  • LogicRect = CRect(rcClient);
  • pDC->DPtoLP(&LogicRect);
  • // Déclaration de BitMap... (Utile pour le Double-Buffering)
  • CBitmap memBmp;
  • CBitmap* OldBmp;
  • // Affichage des Adresses de DC...
  • CString szAdrsDC;
  • if(!mDoubleBuffering)
  • {
  • // Si le Double-Buffering n'est pas Actif...
  • pDC2=pDC; // Le Context de Périférique sur lequel on Dessine
  • // est Celui que l'on Affiche Directement (Pas de Tampon !!!)
  • }
  • else
  • {
  • //Sinon...(Ici pDC2 garde sa Valeur, Affecter dès le Départ!!!)
  • memBmp.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); // On Créer un BitMap de la Largeur de la Zone Client (du DC en Cour)
  • OldBmp = pDC2->SelectObject(&memBmp); // On selectionne ce BitMap
  • pDC2->SetWindowOrg(LogicRect.TopLeft().x,LogicRect.TopLeft().y); // Correction d'un Bug (Car l'Affichage du BitMap ne Travaille pas en Dehors de l'Ecran)
  • }
  • // Création d'un Chaine contenant les Adresses de DC...
  • szAdrsDC.Format(" pDC :%X - &DC2 :%X - pDC2 :%X",pDC,&DC2,pDC2);
  • // Effacement du Fond...
  • LogicRect.InflateRect(1,1); // Tracer un Rectangle (BLANC=FOND) de la Taille de la Zone Client (un peu Plus)
  • /* // 1er Méthode ...
  • CBrush backBrush;
  • backBrush.CreateSolidBrush(RGB(255, 255, 255));
  • pDC2->FillRect(LogicRect, &backBrush);
  • backBrush.DeleteObject();
  • */
  • // 2em Méthode
  • pDC2->SelectStockObject(WHITE_BRUSH);
  • pDC2->Rectangle(LogicRect);
  • // Opérations de Dessin dans le Context de Périférique Selectionné...
  • //Brouillage
  • pDC2->MoveTo(-5,210);
  • pDC2->LineTo(0,290);
  • pDC2->LineTo(5,210);
  • pDC2->LineTo(10,290);
  • pDC2->LineTo(15,210);
  • pDC2->LineTo(20,290);
  • pDC2->LineTo(25,210);
  • pDC2->LineTo(30,290);
  • pDC2->LineTo(35,210);
  • pDC2->LineTo(40,290);
  • pDC2->LineTo(45,210);
  • pDC2->LineTo(50,290);
  • pDC2->LineTo(55,210);
  • pDC2->LineTo(60,290);
  • pDC2->LineTo(65,210);
  • pDC2->LineTo(70,290);
  • pDC2->LineTo(75,210);
  • pDC2->LineTo(80,290);
  • pDC2->LineTo(85,210);
  • pDC2->LineTo(90,290);
  • pDC2->LineTo(95,210);
  • pDC2->LineTo(100,290);
  • pDC2->LineTo(105,210);
  • pDC2->LineTo(110,290);
  • pDC2->LineTo(115,210);
  • pDC2->LineTo(120,290);
  • pDC2->LineTo(125,210);
  • pDC2->LineTo(130,290);
  • pDC2->LineTo(135,210);
  • pDC2->LineTo(140,290);
  • pDC2->LineTo(145,210);
  • pDC2->LineTo(150,290);
  • pDC2->LineTo(155,210);
  • pDC2->LineTo(160,290);
  • pDC2->LineTo(165,210);
  • // pDC2->Rectangle(-10,200,700,300);
  • // pDC2->Rectangle(-10,150,300,300);
  • CBrush* pOldBrush=static_cast<CBrush*>(pDC2->SelectStockObject(LTGRAY_BRUSH));
  • pDC2->Ellipse(30,30,60,60);
  • pDC2->MoveTo(0,80);
  • pDC2->LineTo(20,60);
  • pDC2->LineTo(70,60);
  • pDC2->LineTo(90,80);
  • pDC2->MoveTo(30,150);
  • pDC2->LineTo(45,100);
  • pDC2->LineTo(60,150);
  • pDC2->MoveTo(20,60);
  • pDC2->LineTo(45,100);
  • pDC2->LineTo(70,60);
  • // Aileron 1
  • pDC2->MoveTo(360,300);
  • pDC2->LineTo(360,150);
  • pDC2->LineTo(400,130);
  • // Corps de la Fusé
  • pDC2->Rectangle(400,180,480,30);
  • // Aileron 2
  • pDC2->MoveTo(440,130);
  • pDC2->LineTo(440,300);
  • // Aileron 3
  • pDC2->MoveTo(520,300);
  • pDC2->LineTo(520,150);
  • pDC2->LineTo(480,130);
  • //Tête de Fusé
  • pDC2->MoveTo(400,30);
  • pDC2->LineTo(440,-30);
  • pDC2->LineTo(480,30);
  • pDC2->MoveTo(440,-30);
  • pDC2->LineTo(440,-70 );
  • pDC2->Rectangle(-10,200,700,300);
  • pDC2->Rectangle(-10,150,300,300);
  • pDC2->SelectObject(pOldBrush);
  • //pDC2->SelectStockObject(HOLLOW_BRUSH);
  • //pDC2->SelectStockObject(WHITE_BRUSH);
  • pDC2->SetBkMode(TRANSPARENT);
  • pDC2->TextOut(LogicRect.TopLeft().x,LogicRect.TopLeft().y,szAdrsDC); // Affichage des Adresses
  • pDC2->SetTextAlign(TA_RIGHT);
  • pDC2->SetTextColor(RGB(255,0,0) );
  • if(mDoubleBuffering)
  • pDC2->TextOut(LogicRect.BottomRight().x,LogicRect.TopLeft().y,"DOUBLE-BUFFERING "); // Affichage du "Double-Buffering"
  • // Fin des Opérations de Dessin...
  • if(mDoubleBuffering)
  • {
  • // Si le Double-Buffering était activé, On rends les Objets utilisé...
  • pDC->BitBlt(LogicRect.TopLeft().x, LogicRect.TopLeft().y, LogicRect.Width(), LogicRect.Height(), pDC2, LogicRect.TopLeft().x, LogicRect.TopLeft().y,SRCCOPY); // Recopie le BMP à L'Ecran (au Bon Endroit)
  • pDC2->SelectObject(OldBmp);
  • pDC2->DeleteDC();
  • memBmp.DeleteObject();
  • ReleaseDC(pDC);
  • }
  • }
/////////////////////////////////////////////////////////////////////////////
// CDFView drawing
//
// Fonction de Dessin
// Le Double-Buffering agit ici !!!
//////////////////////////////////////
void CDFView::OnDraw(CDC* pDC)
{
	// Ajouter par AppWizard...
	//CDFDoc* pDoc = GetDocument();
	//ASSERT_VALID(pDoc);

	//mise en place du double-buffering ...
	CDC DC2;						// Création d'un DC qui servira de Tampon pour nos Opération de Dessin
	DC2.CreateCompatibleDC(pDC);	// Création du Context de Périférique Compatible avec notre Ecran
	CDC* pDC2=&DC2;					// On affecte à un Pointeur l'Adresse du  Tampon ( au cas où le Double-Buffering serait Activé !!

	


	// Récupération de la Taille Zone Client...
	CRect rcClient;
	GetClientRect(rcClient);
	// Convertir en Zone Logique Conrespondante...
	CRect LogicRect;
	LogicRect = CRect(rcClient);
	pDC->DPtoLP(&LogicRect);
	
	// Déclaration de BitMap... (Utile pour le Double-Buffering)
	CBitmap memBmp;
	CBitmap* OldBmp;

	// Affichage des Adresses de DC...
	CString szAdrsDC;


	if(!mDoubleBuffering)
	{
		// Si le Double-Buffering n'est pas Actif...
		pDC2=pDC;	// Le Context de Périférique sur lequel on Dessine
					// est Celui que l'on Affiche Directement (Pas de Tampon !!!)
	}
	else
	{
		//Sinon...(Ici pDC2 garde sa Valeur, Affecter dès le Départ!!!)
		memBmp.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); // On Créer un BitMap de la Largeur de la Zone Client (du DC en Cour)
		OldBmp = pDC2->SelectObject(&memBmp);								// On selectionne ce BitMap
		pDC2->SetWindowOrg(LogicRect.TopLeft().x,LogicRect.TopLeft().y);	// Correction d'un Bug (Car l'Affichage du BitMap ne Travaille pas en Dehors de l'Ecran)
	}
	
	// Création d'un Chaine contenant les Adresses de DC...
	szAdrsDC.Format(" pDC :%X   -   &DC2 :%X   -   pDC2 :%X",pDC,&DC2,pDC2);

// Effacement du Fond...
	LogicRect.InflateRect(1,1); // Tracer un Rectangle (BLANC=FOND) de la Taille de la Zone Client (un peu Plus)

/*	// 1er Méthode ...
	CBrush backBrush;
	backBrush.CreateSolidBrush(RGB(255, 255, 255));
	pDC2->FillRect(LogicRect, &backBrush);
	backBrush.DeleteObject();
*/
	// 2em Méthode
	pDC2->SelectStockObject(WHITE_BRUSH);
	pDC2->Rectangle(LogicRect);



// Opérations de Dessin dans le Context de Périférique Selectionné...

	//Brouillage
	pDC2->MoveTo(-5,210);
	pDC2->LineTo(0,290);
	pDC2->LineTo(5,210);
	pDC2->LineTo(10,290);
	pDC2->LineTo(15,210);
	pDC2->LineTo(20,290);
	pDC2->LineTo(25,210);
	pDC2->LineTo(30,290);
	pDC2->LineTo(35,210);
	pDC2->LineTo(40,290);
	pDC2->LineTo(45,210);
	pDC2->LineTo(50,290);
	pDC2->LineTo(55,210);
	pDC2->LineTo(60,290);
	pDC2->LineTo(65,210);
	pDC2->LineTo(70,290);
	pDC2->LineTo(75,210);
	pDC2->LineTo(80,290);
	pDC2->LineTo(85,210);
	pDC2->LineTo(90,290);
	pDC2->LineTo(95,210);
	pDC2->LineTo(100,290);
	pDC2->LineTo(105,210);
	pDC2->LineTo(110,290);
	pDC2->LineTo(115,210);
	pDC2->LineTo(120,290);
	pDC2->LineTo(125,210);
	pDC2->LineTo(130,290);
	pDC2->LineTo(135,210);
	pDC2->LineTo(140,290);
	pDC2->LineTo(145,210);
	pDC2->LineTo(150,290);
	pDC2->LineTo(155,210);
	pDC2->LineTo(160,290);
	pDC2->LineTo(165,210);

	
//	pDC2->Rectangle(-10,200,700,300);
//	pDC2->Rectangle(-10,150,300,300);


	CBrush* pOldBrush=static_cast<CBrush*>(pDC2->SelectStockObject(LTGRAY_BRUSH));
	pDC2->Ellipse(30,30,60,60);

	pDC2->MoveTo(0,80);
	pDC2->LineTo(20,60);
	pDC2->LineTo(70,60);
	pDC2->LineTo(90,80);

	pDC2->MoveTo(30,150);
	pDC2->LineTo(45,100);
	pDC2->LineTo(60,150);

	pDC2->MoveTo(20,60);
	pDC2->LineTo(45,100);
	pDC2->LineTo(70,60);


	// Aileron 1
	pDC2->MoveTo(360,300);
	pDC2->LineTo(360,150);
	pDC2->LineTo(400,130);


	// Corps de la Fusé
	pDC2->Rectangle(400,180,480,30);

	// Aileron 2
	pDC2->MoveTo(440,130);
	pDC2->LineTo(440,300);

	// Aileron 3
	pDC2->MoveTo(520,300);
	pDC2->LineTo(520,150);
	pDC2->LineTo(480,130);


	//Tête de Fusé
	pDC2->MoveTo(400,30);
	pDC2->LineTo(440,-30);
	pDC2->LineTo(480,30);

	pDC2->MoveTo(440,-30);
	pDC2->LineTo(440,-70 );


	pDC2->Rectangle(-10,200,700,300);
	pDC2->Rectangle(-10,150,300,300);

	pDC2->SelectObject(pOldBrush);
	//pDC2->SelectStockObject(HOLLOW_BRUSH);
	//pDC2->SelectStockObject(WHITE_BRUSH);
	
	


	pDC2->SetBkMode(TRANSPARENT);
	pDC2->TextOut(LogicRect.TopLeft().x,LogicRect.TopLeft().y,szAdrsDC); // Affichage des Adresses
	
	pDC2->SetTextAlign(TA_RIGHT);
	pDC2->SetTextColor(RGB(255,0,0) );

	if(mDoubleBuffering)
		pDC2->TextOut(LogicRect.BottomRight().x,LogicRect.TopLeft().y,"DOUBLE-BUFFERING "); // Affichage du "Double-Buffering"

// Fin des Opérations de Dessin...



	if(mDoubleBuffering)
	{
		// Si le Double-Buffering était activé, On rends les Objets utilisé...
		pDC->BitBlt(LogicRect.TopLeft().x, LogicRect.TopLeft().y, LogicRect.Width(), LogicRect.Height(), pDC2, LogicRect.TopLeft().x, LogicRect.TopLeft().y,SRCCOPY);	// Recopie le BMP à L'Ecran (au Bon Endroit)
		pDC2->SelectObject(OldBmp);
		pDC2->DeleteDC();
		memBmp.DeleteObject();
		ReleaseDC(pDC);
	}
}

Conclusion

L'Affichage montre (En Direct) l'Activation du D.F.
Vous pouvez Observez ceci :
Quand le D.F. est Actif pDC2=&DC2 qui Signifie que le Dessin à Lieu dans le Tampon !!!
Quand le D.F. est InActif pDC2=pDC qui Signifie que le Dessin à Lieu Directement à l'Ecran !!!
-------------------------------------------------
J'ai commenté au mieux la Source.
Il faut bien sur intégrer la Fonction OnDraw() dans l'un de vos Programme MFC


J'ai cependant besoin d'éclaircissement :
Ceci à été réalisé "à Taton"

1)Notament : SetWindowOrg()
Sans cela l'Affichage n'est pas Correct.
Mais je ne peux pas apporter plus d'explication que ce que j'ai mis en Commentaire...

2)La Libération des Ressources...
Je ne connais pas exactement le Mécanisme, mais sans, ca ne marche pas !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de pgl10 le 29/12/2008 11:13:02

Ce qui serait très bien :
- mettre dans le zip la totalité des sources, DF.dsw et DF.dsp ( si c'est leurs noms ).
- utiliser : http://www.cppfrance.com/code.aspx?id=9897 pour neutraliser l'avertissement.
Merci.

signaler à un administrateur
Commentaire de shorzy le 30/12/2008 12:14:42

En Effet, mais les autres Fichiers étaient en B*rd*l, avec des instructions mis en Commentaire partout
pour me servir de Brouillon... (un b*rd*l sans nom...)

J'ai préféré passer du Temps sur la Présentation de la Fonction vraiment utile 'OnDraw()'
Le reste: On peut le Générer en Automatique par AppWizard (Visual C++)

Il faut juste rajouter la Fonction de Déplacement...
Si Certain en on Vraiment Besoin, je peut le rajouter... Mais c'est la Méthode Bâteau !!!
(Rien d'Exceptionnel à ce niveau)

signaler à un administrateur
Commentaire de shorzy le 19/02/2009 21:20:08

Avec vous des Commentaires Plz
Je vois que des Tas de Gens voie cette Source, mais je ne sais même pas
ce que vous en pensez ??

Est ce Utile pour vous ?
Est ce  Tiré par les Cheveux ?
Y a t-il des Fonction toutes faites ou Plus Rapide ???

Bref Qu'en Pensez vous Merci !!

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

directx 9 affichage buffer pixel (unsigned char *) [ par bibnouille78 ] Bonjour a tous !je cherches des infos pour afficher grace a directx un framebuffer provenant d'une webcam en passant pas une fonction qui aurait comme affichage d'images par une fonction [ par Dr_zoidberg ] Bonjour, Je cherche à créer une fonction permettant d'afficher une image dans un "drawingarea" mais sans devoir faire appel à un expose_event. Le but Affichage, graphisme fenetre en C/C++ [ par sdrthomas ] Bonjour bonjour,Voilà je suis en école d'ingé et ai reçu des cours de C++ puis C. Le problème c'est que tout ça est resté très terre à terre. Je pense Affichage de texte dynamique ? [ par tintin72 ] Bonjour, J'aimerai avoir certaines confirmations au sujet de l'affichage de texte dynamique.J'ai fait un programme qui affiche dynamiquement (avec Inv Problème d'affichage, couleurs, faces visibles/cachées [ par Tibabou ] Bonjour/soir,&nbsp;Avec le code ci-dessous, j'obtiens une sph&#232;re "bizarre", j'ai le m&#234;me probl&#232;me avec des cubes, on voit le fond &#224 Probleme d'affichage [ par the beber ] Bonjour j'utilise la librairie allegropour un jeu mais j'ai un probleme. Quand j'appuis sur la touche haut, je deplace limage vers le haut. Mais son d Requete Access et Affichage [ par Marion0904 ] Bonjour, je cherche &#224; afficher le r&#233;sultat d'une requete toute simple (SELECT A.nom, B.sexe FROM TableA as A, TableB as B WHERE B.nom = A.no affichage temps [ par imothepe_33 ] salut !!!je suis en train de faire une application sur vc++ et je veux afficher le temps dans une CEdit.Aidez moi...S'il ya une fonction de conversion cacher des TabControl sous visual [ par superbat81 ] Bonjour, je programme en C++ sous Visual, j'ai une forme dans laquel j'ai ajouter 3 onglets de type TabControl et j'aimerai pouvoir g&#233;rer leur af affichage [ par anubis52100 ] bonjour je n'arrive pas a afiche se qu'il y a dans mon fichier txt qui contient plusieurs nom d'&#233;l&#232;ve du type :pierrepauletc...&nbsp;dans ma


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.