begin process at 2012 02 09 07:09:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

DirectX

 > [DX 9.0] SCENES EN WINDOWED : SIMPLES ET MULTIPLES AVEC SWAPCHAINS

[DX 9.0] SCENES EN WINDOWED : SIMPLES ET MULTIPLES AVEC SWAPCHAINS


 Information sur la source

Note :
Aucune note
Catégorie :DirectX Niveau :Initié Date de création :18/08/2004 Date de mise à jour :18/08/2004 18:31:52 Vu / téléchargé :4 332 / 267

Auteur : Xs

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

 Description

Bonjours tout le monde !

Ce code est divisé en deux parties :
- Un répertoire montrant comment rendre une scéne sur autre chose qu'une fenêtre compléte ou en fullscreen (aussi bien un bouton qu'une picture box). Etant donné que j'ai eu un mal fou à rendre une scéne avec DirectX sur autre chose qu'une fenêtre entiére, je me suis dit que je pouvais vous en faire profiter ici.

- Un autre répertoire présentant cette fois-ci le rendu sur DES composants. Il y a deux techniques pour rendre plusieurs scénes (ou la même mais sous un autre angle, ou le même:D). La premiére, celle déjà posté sur le site il me semble est celle de la création d'autant de devices que deux scénes. Cette technique est simple mais hyper couteuse.
La seconde, celle employée ici, est celle des SwapChains. Elle est inspirée en partie de l'exemple de codesampler (modifié, et remis à ma sauceuh). Cette méthode présente l'avantage d'être peu couteuse, et surtout assez facilement extensible à n scénes.

Source

  • //CODE DU SECOND REPERTOIRE
  • //MAIN.CPP UNIQUEMENT (RESTE DANS LE ZIP)
  • #include <windows.h>
  • #include <commctrl.h>
  • #include "DXUtils.h"
  • #include "resource.h"
  • #define SAFE_RELEASE(a) if(a){a->Release();a=NULL;}
  • #define SAFE_RELEASE_ARRAY(a) if(a){delete [] a;a = NULL;}
  • extern HWND g_hDlg;
  • HWND g_hPicture1;
  • HWND g_hPicture2;
  • char g_FPS[6];
  • bool g_CallBoucle = true;
  • SFontProperties* g_FontTab = NULL;
  • bool Update1()
  • {
  • static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
  • {
  • srand((unsigned int)timeGetTime()); //On réinitialise le hasard.
  • //-----------Préparation des variables d'affichage------
  • static float Timer = 0.0f;
  • static float dwFrames = 0.0f;
  • CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • //-----------Préparation du device pour l'affichage-----
  • DXUtil_Timer(TIMER_START);
  • g_MainSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
  • g_Device->SetRenderTarget(0,g_Surf);
  • g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  • g_Device->BeginScene();
  • PrintText("Premiere fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);
  • dwFrames++;
  • PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
  • //FPS
  • if( CurrentTime-Timer > 1.0f )
  • {
  • sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
  • dwFrames = 0;
  • Timer = CurrentTime;
  • }
  • //-----------Affichage de la frame----------------------
  • g_Device->EndScene();
  • g_MainSwapChain->Present(NULL,NULL,g_hPicture1,NULL,0);
  • }
  • return true;
  • }
  • bool Update2()
  • {
  • static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
  • {
  • srand((unsigned int)timeGetTime()); //On réinitialise le hasard.
  • //-----------Préparation des variables d'affichage------
  • static float Timer = 0.0f;
  • static float dwFrames = 0.0f;
  • CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • //-----------Préparation du device pour l'affichage-----
  • DXUtil_Timer(TIMER_START);
  • g_SecondSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
  • g_Device->SetRenderTarget(0,g_Surf);
  • g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  • g_Device->BeginScene();
  • PrintText("Seconde fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);
  • dwFrames++;
  • PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
  • //FPS
  • if( CurrentTime-Timer > 1.0f )
  • {
  • sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
  • dwFrames = 0;
  • Timer = CurrentTime;
  • }
  • //-----------Affichage de la frame----------------------
  • g_Device->EndScene();
  • g_SecondSwapChain->Present(NULL,NULL,g_hPicture2,NULL,0);
  • }
  • return true;
  • }
  • bool CenterDlg(HWND hWnd)
  • {
  • RECT l_Dim;
  • int l_ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  • int l_ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  • GetWindowRect(hWnd,&l_Dim);
  • int l_AppWidth = l_Dim.right - l_Dim.left;
  • int l_AppHeight = l_Dim.bottom - l_Dim.top;
  • //Center the window
  • SetWindowPos(hWnd,HWND_TOP,(l_ScreenWidth-l_AppWidth)/2,
  • (l_ScreenHeight-l_AppHeight)/2,
  • l_AppWidth,
  • l_AppHeight,
  • SWP_SHOWWINDOW);
  • return true;
  • }
  • LRESULT CALLBACK DlgProc(HWND DlgProc, UINT msg, WPARAM wParam, LPARAM lParam)
  • {
  • switch(msg)
  • {
  • case WM_CLOSE:
  • DestroyWindow(DlgProc);
  • break;
  • case WM_DESTROY:
  • PostQuitMessage(0);
  • break;
  • case WM_INITDIALOG:
  • break;
  • case WM_COMMAND:
  • switch(HIWORD(wParam))
  • {
  • case BN_CLICKED:
  • switch(LOWORD(wParam))
  • {
  • case IDCANCEL:
  • DestroyWindow(DlgProc);
  • break;
  • }
  • break;
  • }
  • break;
  • default:
  • return FALSE;
  • }
  • return FALSE;
  • }
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  • LPSTR lpCmdLine, int nCmdShow)
  • {
  • MSG Msg;
  • g_hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAINFORM), NULL, (DLGPROC) DlgProc);
  • CenterDlg(g_hDlg);
  • RECT rc;
  • //GetWindowRect(g_hDlg,&rc);
  • //les deux sont possibles
  • GetWindowRect(GetDlgItem(g_hDlg,IDC_PICTURE2),&rc);
  • InitDGraphics(rc.right-rc.left,rc.bottom-rc.top,32);
  • if(g_hDlg == NULL)
  • {
  • MessageBox(NULL, "Window Creation Failed!", "Error!",
  • MB_ICONEXCLAMATION | MB_OK);
  • return 0;
  • }
  • //-----Création et initialisation des polices
  • g_FontTab = LoadFonts(g_FontTab,"FontList.wbf");
  • if( g_FontTab == NULL )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
  • return -1;
  • }
  • else
  • {
  • HFONT l_TmpFont;
  • g_FontList = new LPD3DXFONT[g_NumbOfFonts];
  • for(int k=0 ; k<g_NumbOfFonts ; k++)
  • {
  • l_TmpFont = CreateFont( g_FontTab[k].m_Size, //taille de la police : 10, 12, 16, etc
  • 0, 0, 0,
  • g_FontTab[k].m_Flag, //texte gras ou non
  • g_FontTab[k].m_Italic, //italique : true ou false
  • g_FontTab[k].m_Underlined, //souligné : true ou false
  • FALSE,
  • ANSI_CHARSET,
  • OUT_DEFAULT_PRECIS,
  • CLIP_DEFAULT_PRECIS,
  • ANTIALIASED_QUALITY,
  • VARIABLE_PITCH,
  • g_FontTab[k].m_Name);
  • D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
  • DeleteObject( l_TmpFont );
  • }
  • }
  • InitCommonControls();
  • ShowWindow(g_hDlg, nCmdShow);
  • UpdateWindow(g_hDlg);
  • g_hPicture1 = GetDlgItem(g_hDlg,IDC_PICTURE);
  • g_hPicture2 = GetDlgItem(g_hDlg,IDC_PICTURE2);
  • while(g_CallBoucle)
  • {
  • //pour les erreurs non debug
  • if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
  • {
  • if ( !GetMessage(&Msg, NULL, 0, 0) ) g_CallBoucle=false;
  • DispatchMessage(&Msg);
  • }
  • else
  • {
  • if( !Update1() || !Update2() )
  • g_CallBoucle=false;
  • }
  • }
  • for(int i=0;i<g_NumbOfFonts;i++)
  • g_FontList[i]->Release();
  • SAFE_RELEASE_ARRAY(g_FontList);
  • SAFE_RELEASE_ARRAY(g_FontTab);
  • SAFE_RELEASE(g_Surf);
  • SAFE_RELEASE(g_MainSwapChain);
  • SAFE_RELEASE(g_SecondSwapChain);
  • SAFE_RELEASE(g_Device);
  • SAFE_RELEASE(g_D3D);
  • return Msg.wParam;
  • }
//CODE DU SECOND REPERTOIRE
//MAIN.CPP UNIQUEMENT (RESTE DANS LE ZIP)

#include <windows.h>
#include <commctrl.h>
#include "DXUtils.h"
#include "resource.h"


#define SAFE_RELEASE(a) if(a){a->Release();a=NULL;}
#define SAFE_RELEASE_ARRAY(a) if(a){delete [] a;a = NULL;} 


extern HWND g_hDlg;
HWND g_hPicture1;
HWND g_hPicture2;
char g_FPS[6];
bool g_CallBoucle = true;
SFontProperties* g_FontTab = NULL;	


bool Update1()
{
	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
	{
		srand((unsigned int)timeGetTime());	//On réinitialise le hasard.

		//-----------Préparation des variables d'affichage------
		static float Timer = 0.0f;
		static float dwFrames = 0.0f;
		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

		//-----------Préparation du device pour l'affichage-----
		DXUtil_Timer(TIMER_START);

		g_MainSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
		g_Device->SetRenderTarget(0,g_Surf);

		g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
		g_Device->BeginScene();

		PrintText("Premiere fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);

		dwFrames++;
		PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
		
		//FPS
		if( CurrentTime-Timer > 1.0f )
		{
			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
			dwFrames = 0;
			Timer = CurrentTime;
		}

		//-----------Affichage de la frame----------------------

		g_Device->EndScene();
		g_MainSwapChain->Present(NULL,NULL,g_hPicture1,NULL,0);
	}
	return true;
}

bool Update2()
{
	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
	{
		srand((unsigned int)timeGetTime());	//On réinitialise le hasard.

		//-----------Préparation des variables d'affichage------
		static float Timer = 0.0f;
		static float dwFrames = 0.0f;
		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

		//-----------Préparation du device pour l'affichage-----
		DXUtil_Timer(TIMER_START);

		g_SecondSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
		g_Device->SetRenderTarget(0,g_Surf);

		g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
		g_Device->BeginScene();

		PrintText("Seconde fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);

		dwFrames++;
		PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
		
		//FPS
		if( CurrentTime-Timer > 1.0f )
		{
			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
			dwFrames = 0;
			Timer = CurrentTime;
		}

		//-----------Affichage de la frame----------------------

		g_Device->EndScene();
		g_SecondSwapChain->Present(NULL,NULL,g_hPicture2,NULL,0);
	}
	return true;
}

bool CenterDlg(HWND hWnd)
{
 RECT l_Dim;
 int l_ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
 int l_ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
 
 GetWindowRect(hWnd,&l_Dim); 
 int l_AppWidth = l_Dim.right - l_Dim.left;
 int l_AppHeight = l_Dim.bottom - l_Dim.top;
 
 //Center the window
 SetWindowPos(hWnd,HWND_TOP,(l_ScreenWidth-l_AppWidth)/2,
							    (l_ScreenHeight-l_AppHeight)/2,
							    l_AppWidth,
							    l_AppHeight,
							    SWP_SHOWWINDOW);

 return true;
}

LRESULT CALLBACK DlgProc(HWND DlgProc, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch(msg)
 { 
 case WM_CLOSE:
  DestroyWindow(DlgProc); 
 break;
 case WM_DESTROY:
   PostQuitMessage(0);
 break;
 case WM_INITDIALOG:
 break;
 case WM_COMMAND: 
  switch(HIWORD(wParam))
  {
   case BN_CLICKED:
    switch(LOWORD(wParam))
	{
     case IDCANCEL:
      DestroyWindow(DlgProc);
     break;
	}
   break;
  }
 break;

 default:
  return FALSE;
 }

 return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG Msg;

g_hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAINFORM), NULL, (DLGPROC) DlgProc);

CenterDlg(g_hDlg);

RECT rc;
//GetWindowRect(g_hDlg,&rc);
//les deux sont possibles
GetWindowRect(GetDlgItem(g_hDlg,IDC_PICTURE2),&rc);

InitDGraphics(rc.right-rc.left,rc.bottom-rc.top,32);


if(g_hDlg == NULL)
 {
 MessageBox(NULL, "Window Creation Failed!", "Error!",
 MB_ICONEXCLAMATION | MB_OK);
 return 0;
 }

//-----Création et initialisation des polices
	g_FontTab = LoadFonts(g_FontTab,"FontList.wbf");
	
	if( g_FontTab == NULL )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
		return -1;
	}
	else
	{
		HFONT l_TmpFont;
		g_FontList = new LPD3DXFONT[g_NumbOfFonts];

		for(int k=0 ; k<g_NumbOfFonts ; k++)
		{
			l_TmpFont = CreateFont( g_FontTab[k].m_Size,		//taille de la police : 10, 12, 16, etc
								  0, 0, 0,
								  g_FontTab[k].m_Flag,			//texte gras ou non
								  g_FontTab[k].m_Italic,		//italique : true ou false
								  g_FontTab[k].m_Underlined,    //souligné : true ou false
								  FALSE,
								  ANSI_CHARSET,
								  OUT_DEFAULT_PRECIS,
								  CLIP_DEFAULT_PRECIS,
								  ANTIALIASED_QUALITY,
								  VARIABLE_PITCH,
								  g_FontTab[k].m_Name);

			D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
			DeleteObject( l_TmpFont );
		}
	}

InitCommonControls();
ShowWindow(g_hDlg, nCmdShow);
UpdateWindow(g_hDlg);

g_hPicture1 = GetDlgItem(g_hDlg,IDC_PICTURE);
g_hPicture2 = GetDlgItem(g_hDlg,IDC_PICTURE2);


	while(g_CallBoucle)
	{
	//pour les erreurs non debug
		if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
		{
			if ( !GetMessage(&Msg, NULL, 0, 0) ) g_CallBoucle=false;
				DispatchMessage(&Msg);
		}
		else
		{
			if( !Update1() || !Update2() )
				g_CallBoucle=false;
		}
	}


	for(int i=0;i<g_NumbOfFonts;i++)
		g_FontList[i]->Release();

	SAFE_RELEASE_ARRAY(g_FontList);
	SAFE_RELEASE_ARRAY(g_FontTab);

	SAFE_RELEASE(g_Surf);
	SAFE_RELEASE(g_MainSwapChain);
	SAFE_RELEASE(g_SecondSwapChain);
	SAFE_RELEASE(g_Device);
	SAFE_RELEASE(g_D3D);

 return Msg.wParam;
} 

 Conclusion

L'exe de "Rendu logiciel" foire en Release (mais marche en Debug) :S

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Rendu composant
    • DXUtils.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 770 octets
    • FontList.wbfTélécharger ce fichier [Réservé aux membres club]115 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 651 octets
    • RenduCpt.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 454 octets
    • RenduCpt.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier541 octets
    • RenduCpt.ncbTélécharger ce fichier [Réservé aux membres club]50 176 octets
    • RenduCpt.optTélécharger ce fichier [Réservé aux membres club]50 688 octets
    • RenduCpt.plgTélécharger ce fichier [Réservé aux membres club]1 402 octets
    • resource.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier639 octets
    • Script1.apsTélécharger ce fichier [Réservé aux membres club]32 544 octets
    • Script1.rcTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 603 octets
    • StructsDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier635 octets
    • SwapChains.ncbTélécharger ce fichier [Réservé aux membres club]50 176 octets
    • SwapChains.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • SwapChains.plgTélécharger ce fichier [Réservé aux membres club]1 017 octets
    • Test.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • Test.optTélécharger ce fichier [Réservé aux membres club]49 664 octets
    • Test.plgTélécharger ce fichier [Réservé aux membres club]993 octets
  •   SwapChains
    • DXUtils.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 879 octets
    • FontList.wbfTélécharger ce fichier [Réservé aux membres club]115 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 140 octets
    • resource.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier639 octets
    • Script1.apsTélécharger ce fichier [Réservé aux membres club]17 980 octets
    • Script1.rcTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 736 octets
    • StructsDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier635 octets
    • SwapChains.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 472 octets
    • SwapChains.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier545 octets
    • SwapChains.exeTélécharger ce fichier [Réservé aux membres club]307 200 octets
    • SwapChains.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • SwapChains.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • SwapChains.plgTélécharger ce fichier [Réservé aux membres club]1 247 octets
    • Test.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • Test.optTélécharger ce fichier [Réservé aux membres club]49 664 octets
    • Test.plgTélécharger ce fichier [Réservé aux membres club]993 octets

Télécharger le zip


 Historique

18 août 2004 18:31:52 :
zip peux etre ?

 Sources du même auteur

Source avec Zip PACKAGE MANAGER
Source avec Zip [API WIN32] CLASSE D'ACCÈS ET DE GESTION DU REGISTRE (RÉEL E...
Source avec Zip Source avec une capture [DX 9.0] WATERBALL - JEU COMPLET EN DX9 (STYLE ARKANOÏD)
Source avec Zip [CBX] CALCULETTE DYNAMIQUE
Source avec Zip [VC++]FONCTIONS POUR CONVERTIR (DEGRÉES, GRADES, RADIANS)

 Sources de la même categorie

Source avec Zip Source avec une capture MP3 DX9 JOUER par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture EQUINOX VISUAL SON METER par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture FLEUR EN DELIRE! par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture DIREXCT X 9 D3D par f_l_a_s_h_b_a_c_k
Source avec Zip BLOP DIRECT X par f_l_a_s_h_b_a_c_k

Commentaires et avis

Commentaire de Xs le 18/08/2004 18:04:37

Le zip a pas été uploadé grr

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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 : 0,718 sec (4)

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