begin process at 2012 02 12 13:30:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > DOUBLE BUFFERING (MFC)

DOUBLE BUFFERING (MFC)


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :Graph, Buffer, Double Buffer, Graphisme, affichage Niveau :Initié Date de création :28/12/2008 Vu / téléchargé :3 441 / 120

Auteur : shorzy

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER
Source avec Zip Source avec une capture QXTAPPLICATION - RACCOURCI BLAGUE
Source avec Zip Source avec une capture FAIRE GLISSER LA SOURIS

 Sources de la même categorie

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi
Source avec Zip Source avec une capture XCOUPE : COUPE 2D par pop70

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel
Source avec Zip Source avec une capture EVALUATEUR_EXPRESSION_ARITHMETIQUE par Donald180v
Source avec Zip Source avec une capture XCOUPE : COUPE 2D par pop70
Source avec Zip Source avec une capture CLASSE GRAPH: GESTION DES GRAPHIQUES DANS LES APPLICATIONS W... par Pistol_Pete
Source avec Zip LANCÉ DU POIDS (GRAPHISME ET DÉPLACEMENT) par nicompx

Commentaires et avis

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.

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)

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 PROBLÈME affichage contenu d'un fichier ! [ par charleslemagicien ] Bonjour à tous, Dans mon programme je dois ouvrir et lire le contenu d'un fichier et l'afficher à l'écran pour l'instant aucun problème sa marche... 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 9,469 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales