// "Handler" pour la boîte de dialogue
LRESULT CALLBACK DlgTiles(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i,j;

	switch (message)
	{
		case WM_INITDIALOG:
			//Inscription des valeurs par défaut dans les cases prévues à cet effet...
			sprintf(str,"%i",tileX);
			SetDlgItemText(hDlg,IDC_EDIT1,str);
			sprintf(str,"%i",tileY);
			SetDlgItemText(hDlg,IDC_EDIT2,str);
			return TRUE;

		case WM_COMMAND:

			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
				//Récupération des valeurs et conversion en entiers
				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
				i=atoi(str);
				GetDlgItemText(hDlg,IDC_EDIT2,str,sizeof(str));
				j=atoi(str);
				//D'abord faire quelques tests pour vérifier s'il ne s'agit pas d'âneries...
				if (i%8!=0 || j%8!=0)	{
					MessageBox(hDlg,"Les dimensions des blocs doivent être multiple de 8 pour passer sur la GBA! ;-)","Oups...",MB_ICONERROR);
					break;
				}
				if (i<8 || j<8 || i>64 || j>64)	{
					MessageBox(hDlg,"La taille entrée est trop petite ou trop grande, à vous de voir.\n8<=Taille(x;y)<=64","Oups...",MB_ICONERROR);
					break;
				}
				if ((i!=8 && i!=16 && i!=32 && i!=64) || (j!=8 && j!=16 && j!=32 && j!=64))	{
					if (MessageBox(hDlg,"Pour passer correctement sous l'éditeur, la largeur et la hauteur doivent être une de ces valeurs:\n8, 16, 32, 64.\nSi cette règle n'est pas respectée, l'éditeur intégré refusera d'ouvrir votre fichier, mais le résultat sera tout de même utilisable sur GBA (et encore, ça dépend de la taille de la map).\nÊtes-vous sûr(e) de vouloir utiliser ce format?","Oups...",MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
						break;
				}
				//Avertissement si on choisit un format plus grand que l'original
				if ((i>tileX || j>tileY) && editeurOuvert)		{
					if (MessageBox(hDlg,"D'une manière générale, si vous convertissez les tiles à un format plus grand que l'original, le résultat sera faux, car les tiles n'ont pas été à la base arrangées pour (ou bien elles ont été optimisées).\nÊtes-vous sûr(e) de vouloir utiliser ce format?","Oups...",MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
						break;
				}

				//Tests passés ;)
				tileX=i, tileY=j;
				sprintf(str,"%ix%i",i,j);
				SendMessage(hComboTiles,CB_DELETESTRING,3,0);
				SendMessage(hComboTiles,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)str);
				SendMessage(hComboTiles,CB_SETCURSEL,3,0);
				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}


// "Handler" pour la boîte de dialogue
LRESULT CALLBACK DlgNouvDoss(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	HWND hCombo;
	int i;
	char nom[31], dossier[31];
	char str[1000];
	ELEMENT el;

	switch (message)
	{
		case WM_INITDIALOG:
			hCombo=GetDlgItem(hDlg,IDC_COMBO1);
			for (i=0;i<nbreDossiersBase;i++)		{
				SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)noms_dossiers_base[i]);
			}
			for (i=0;i<nbreElements;i++)		{
				if (elements[i].type&TYPE_DOSSIER)
					SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
			}
			SendMessage(hCombo,CB_SETCURSEL,0,0);
			return TRUE;

		case WM_COMMAND:

			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
				GetDlgItemText(hDlg,IDC_EDIT1,nom,sizeof(nom));
				GetDlgItemText(hDlg,IDC_COMBO1,dossier,sizeof(dossier));
				for (i=0;i<nbreElements;i++)		{
					if (elements[i].type&TYPE_DOSSIER)
						if (!strcmp(elements[i].nom_court,nom))		{
							sprintf(str,"Ce nom de dossier existe déjà dans le répertoire %s.\nChoisissez-en un autre ou précédez ce nom d'un autre puis d'un slash pour les différencier.\nPar exemple Rep1\\Test et Rep2\\Test sont tous deux affichés Test mais identifiés différemment.",elements[i].dossier);
							MessageBox(hDlg,str,"Erreur",MB_ICONERROR);
							return FALSE;
						}
				}
				strcpy(el.dossier,dossier);
				strcpy(el.nom_court,nom);
				el.type=DANS_DOSSIER|TYPE_DOSSIER;
				AjouteAuProjet(el);
				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}

LRESULT CALLBACK DlgExec(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	FILE *f;
	char str[10000], *ptr;
	static char *contenu=NULL;

	switch (message)
	{
		case WM_INITDIALOG:
			if (bInviteScriptContenuSauve)			{
				SetDlgItemText(hDlg, IDC_EDIT1, contenu);
				SendDlgItemMessage(hDlg, IDC_EDIT1, EM_SETSEL, 0, -1);
			}
			return TRUE;

		case WM_COMMAND:

			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));

				//Sauvegarde le contenu
				if (!bInviteScriptContenuSauve)
					contenu = (char*)malloc(sizeof(str));
				bInviteScriptContenuSauve=1;
				strcpy(contenu, str);

				f=tmpfile();
				ptr=str;
				for (ptr=str;*ptr;ptr++)		{
					if (*ptr!='\r')
						fputc(*ptr,f);
				}
				fputs("\nFin\n\n\n\n",f);
				fseek(f,0,SEEK_SET);
				ExecScript(f,NULL);

				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}



LRESULT CALLBACK DlgLier(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	char str[1000], str2[1000];
	HWND hCombo;
	int i,j;

	switch (message)
	{
		case WM_INITDIALOG:
			hCombo=GetDlgItem(hDlg,IDC_COMBO1);
			for (i=0;i<nMaps;i++)		{
				sprintf(str,"%i = %s",i+1,ele_fond[i]->nom_court);
				SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)str);
			}
			strcpy(str2,"");
			for (i=0;liens[fondActif][i]!=LIEN_INVALIDE;i++)		{
				if (i==0)
					sprintf(str,"%i",liens[fondActif][i]+1);
				else
					sprintf(str,", %i",liens[fondActif][i]+1);
				strcat(str2,str);
			}
			SetDlgItemText(hDlg,IDC_EDIT1,str2);
			SetWindowText(hCombo,"(choisissez un fond)");
			return TRUE;

		case WM_COMMAND:

			if (HIWORD(wParam)==CBN_CLOSEUP)		{
				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str)-10);
				i=SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
				if (i==CB_ERR)
					break;
				if (str[0]==0)
					sprintf(str2,"%i",i+1);
				else
					sprintf(str2,", %i",i+1);
				strcat(str,str2);
				SetDlgItemText(hDlg,IDC_EDIT1,str);
				break;
			}

			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
				if (strlen(str)==0)
					sprintf(str, "%i", fondActif+1);
				//Initialise les liens -> chaque map pointe sur elle-même :)
				for (j=0;liens[fondActif][j]!=LIEN_INVALIDE;j++)		{
					i=liens[fondActif][j];
					if (i!=fondActif)		{
						liens[i][0]=i;
						liens[i][1]=LIEN_INVALIDE;
					}
				}
				FctLieMap(str);

				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}



LRESULT CALLBACK DlgCouleurs(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	static CBoutonCouleur cBtClr;
	int nPos;
	double temp;
	unsigned char *ptr;
/*	unsigned char *ptr;
	char str[1000];
	static int posX=0, posY=0, selCouleur=0;
	int r,v,b,sel, nPos;
	double temp;
	LPDRAWITEMSTRUCT lpdis;
	HBRUSH hbr;
	HPEN hpen;
	HWND hBouton;
	RECT rect;
	POINT pt;
	static COLORREF couleurs[16];
	static CHOOSECOLOR cc=		{
		sizeof(CHOOSECOLOR),
		NULL,
		NULL,
		0,
		couleurs,
		CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT,
		NULL,
		NULL,
		NULL
	};*/

	switch (message)
	{
		case WM_INITDIALOG:
			SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETRANGEMAX,1,max((int)(100.0/GammaV),300));
			SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETPOS,1,(LPARAM)(100.0/GammaV));

			SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_SETRANGEMIN,1,-255);
			SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_SETRANGEMAX,1,255);
			SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_SETPOS,1,(LPARAM)AdditionV);

			SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_SETRANGEMIN,1,-255);
			SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_SETRANGEMAX,1,255);
			SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_SETPOS,1,(LPARAM)AlphaV);

			SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_SETRANGEMIN,1,2);
			SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_SETRANGEMAX,1,32);
			SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_SETPOS,1,(LPARAM)nuances+1);

			SendDlgItemMessage(hDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)"Standard");
			SendDlgItemMessage(hDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)"Tramé");
			SendDlgItemMessage(hDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)"Optimal");
			SendDlgItemMessage(hDlg,IDC_COMBO1,CB_SETCURSEL,modeConversion,0);

//			SendDlgItemMessage(hDlg,IDC_CHECK1,BM_SETCHECK,(nuancesAvant?BST_CHECKED:BST_UNCHECKED),0);
			
			cBtClr.OnInit(GetDlgItem(hDlg, IDC_BOUTONCOULEUR));
			cBtClr.cc.rgbResult=RGB(rougeMasque,vertMasque,bleuMasque);

			SendMessage(hDlg,WM_HSCROLL,0,0);
/*			int i;
			i = GetWindowLong(GetDlgItem(hDlg, IDC_BOUTONCOULEUR), GWL_STYLE);
			SetWindowLong(GetDlgItem(hDlg, IDC_BOUTONCOULEUR), GWL_STYLE, i|WS_CHILD);*/
//			SetTimer(hDlg,1,20,NULL);
			return TRUE;

		case WM_SETCURSOR:
			cBtClr.OnSetCursor(hDlg, wParam);
			break;

		case WM_DRAWITEM:
			cBtClr.OnDrawItem(hDlg, lParam);
			break;

		case WM_HSCROLL:
			nPos = SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_GETPOS,0,0);
			sprintf(str,"%#.2f",nPos/100.0);
			SetDlgItemText(hDlg,IDC_EDIT1,str);

			nPos = SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_GETPOS,0,0);
			sprintf(str,"%i",nPos);
			SetDlgItemText(hDlg,IDC_EDIT2,str);

			nPos = SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_GETPOS,0,0);
			sprintf(str,"%i",nPos);
			SetDlgItemText(hDlg,IDC_EDIT3,str);

			nPos = SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_GETPOS,0,0);
			sprintf(str,"%i",nPos);
			SetDlgItemText(hDlg,IDC_EDIT4,str);

			break;

		case WM_SIZE:
			UpdateBackgroundBrush();
			break;

		case WM_CTLCOLORSTATIC:
			BOOL bHandled;
			return OnCtlColor(message, wParam, lParam, bHandled);

		case WM_ERASEBKGND:
			return TRUE;

		case WM_COMMAND:

			if (LOWORD(wParam) == IDC_AVANCE || LOWORD(wParam) == IDC_AVANCEFINI)		{
				SendMessage(GetParent(hDlg), message, wParam, lParam);
			}
			else if (LOWORD(wParam) == IDC_BOUTONCOULEUR)		{
				cBtClr.OnClick(hDlg);
			}
			else if (LOWORD(wParam) == IDC_BUTTON1)		{
				SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETRANGEMAX,1,300);
				SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETPOS,1,100);
				SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_SETPOS,1,0);
				SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_SETPOS,1,0);
				SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_SETPOS,1,32);
				SendDlgItemMessage(hDlg,IDC_COMBO1,CB_SETCURSEL,0,0);
//				SendDlgItemMessage(hDlg,IDC_CHECK1,BM_SETCHECK,BST_UNCHECKED,0);
				SendMessage(hDlg,WM_HSCROLL,0,0);
			}
			else if ((LOWORD(wParam)==IDC_EDIT1 || LOWORD(wParam)==IDC_EDIT2 || LOWORD(wParam)==IDC_EDIT3 || LOWORD(wParam)==IDC_EDIT4) && HIWORD(wParam)==EN_KILLFOCUS)		{
				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
				temp=atof(str);
				SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETRANGEMAX,1,max((int)(temp*100),300));
				SendDlgItemMessage(hDlg,IDC_SLIDER1,TBM_SETPOS,1,(LPARAM)(temp*100.0));

				GetDlgItemText(hDlg,IDC_EDIT2,str,sizeof(str));
				temp=atof(str);
				SendDlgItemMessage(hDlg,IDC_SLIDER2,TBM_SETPOS,1,(LPARAM)temp);

				GetDlgItemText(hDlg,IDC_EDIT3,str,sizeof(str));
				temp=atof(str);
				SendDlgItemMessage(hDlg,IDC_SLIDER3,TBM_SETPOS,1,(LPARAM)temp);

				GetDlgItemText(hDlg,IDC_EDIT4,str,sizeof(str));
				temp=atof(str);
				SendDlgItemMessage(hDlg,IDC_SLIDER4,TBM_SETPOS,1,(LPARAM)temp);
			}

			//Bouton ok
			else if (LOWORD(wParam) == IDOK) 
			{
				ptr=(unsigned char*)&cBtClr.cc.rgbResult;
				rougeMasque=*ptr++;
				vertMasque=*ptr++;
				bleuMasque=*ptr++;

				GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
				temp=atof(str);
				if (temp>0)
					GammaB=GammaV=GammaR=1/temp;

				GetDlgItemText(hDlg,IDC_EDIT2,str,sizeof(str));
				temp=atoi(str);
				if (temp>=-255 && temp<=255)
					AdditionR=AdditionV=AdditionB=temp;

				GetDlgItemText(hDlg,IDC_EDIT3,str,sizeof(str));
				temp=atoi(str);
				if (temp>=-255 && temp<=255)
					AlphaR=AlphaV=AlphaB=temp;

				GetDlgItemText(hDlg,IDC_EDIT4,str,sizeof(str));
				temp=atoi(str);
				if (temp>=2 && temp<=32)
					nuances=(int)temp-1;

				CreeCouleurs();

				modeConversion=SendDlgItemMessage(hDlg,IDC_COMBO1,CB_GETCURSEL,0,0);

				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			else if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}



LRESULT CALLBACK DlgFormats(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	HWND hListe;
	int i;

	switch (message)
	{
		case WM_INITDIALOG:
			hListe=GetDlgItem(hDlg,IDC_LIST1);
			for (i=0;i<nb_sections;i++)
				SendMessage(hListe,LB_ADDSTRING,0,(LPARAM)formats[i].nom);
			for (i=0;i<nb_sections;i++)		{
				if (ptr_formatActuel==&formats[i])		{
					SendMessage(hListe, LB_SETCURSEL, i, 0);
				}
			}
			return TRUE;

		case WM_NOTIFY:
			break;

		case WM_COMMAND:


			if (LOWORD(wParam) == IDC_LIST1)			{
				if (HIWORD(wParam)==LBN_DBLCLK)
					goto ok;
			}

			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
ok:
				i=SendDlgItemMessage(hDlg,IDC_LIST1,LB_GETCURSEL,0,0);
				if (i==LB_ERR)
					break;
				DefFormat(&formats[i]);
				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}


void AppliqueMasque(int etat, unsigned long masque)		{
	int i,j,tmp;
	MAP (*bloc)[1024];
//	for (k=0;k<profondeurSel;k++)				{
//		bloc=blocCopie+1024*k;
		bloc=(MAP (*)[1024])BufferActif();
		if (bloc)		{
			for (j=0;j<CopieY;j++)		{
				for (i=0;i<CopieX;i++)		{
					tmp=bloc[j][i];
					if (tmp==masqueInvisible || (tmp==0 && bitsMasqueZero))
						continue;
					if (etat)
						tmp|=masque;
					else
						tmp&=~masque;
					bloc[j][i]=tmp;
				}
			}
		}
//	}
}


#define Set1Bit(controle,masque)		SendDlgItemMessage(hDlgBits,controle,BM_SETCHECK,(valeur&masque)?BST_CHECKED:BST_UNCHECKED,0);

void SetBits(int valeur)		{
	if (!fenBits)
		return;

	Set1Bit(IDC_CHECK1,0x8000);
	Set1Bit(IDC_CHECK4,0x4000);
	Set1Bit(IDC_CHECK5,0x2000);
	Set1Bit(IDC_CHECK6,0x1000);
	Set1Bit(IDC_CHECK7,0x800);
	Set1Bit(IDC_CHECK8,0x400);
	Set1Bit(IDC_CHECK9,0x200);
	Set1Bit(IDC_CHECK10,0x100);

	SetDlgItemText(hDlgBits,IDC_CHECK1,nomsBits[fondActif][0]);
	SetDlgItemText(hDlgBits,IDC_CHECK4,nomsBits[fondActif][1]);
	SetDlgItemText(hDlgBits,IDC_CHECK5,nomsBits[fondActif][2]);
	SetDlgItemText(hDlgBits,IDC_CHECK6,nomsBits[fondActif][3]);
	SetDlgItemText(hDlgBits,IDC_CHECK7,nomsBits[fondActif][4]);
	SetDlgItemText(hDlgBits,IDC_CHECK8,nomsBits[fondActif][5]);
	SetDlgItemText(hDlgBits,IDC_CHECK9,nomsBits[fondActif][6]);
	SetDlgItemText(hDlgBits,IDC_CHECK10,nomsBits[fondActif][7]);

	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK1),bitsActives[fondActif][0]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK4),bitsActives[fondActif][1]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK5),bitsActives[fondActif][2]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK6),bitsActives[fondActif][3]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK7),bitsActives[fondActif][4]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK8),bitsActives[fondActif][5]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK9),bitsActives[fondActif][6]);
	EnableWindow(GetDlgItem(hDlgBits,IDC_CHECK10),bitsActives[fondActif][7]);
}

void Alloc_Bits()			{
	int i,j;
	if (!nomsBits)			{
		nomsBits=(char(*)[8][TAILLE_MAX_CHAINES])malloc(TAILLE_MAX_CHAINES*8*MAX_FONDS);
		for (i=0;i<NOMBRE_BITS;i++)
			strcpy(nomsBits[0][i],chneNomsDefautBits[i]);
		for (i=1;i<MAX_FONDS;i++)
			memcpy(&nomsBits[i], &nomsBits[0], sizeof(nomsBits[0]));
	}
	if (!bitsActives)			{
		bitsActives=(char(*)[8])malloc(8*MAX_FONDS);
		for (i=0;i<MAX_FONDS;i++)		{
			for (j=0;j<=5;j++)
				bitsActives[i][j]=1;
			for (j=6;j<=7;j++)
				bitsActives[i][j]=0;
		}
	}
}

void Dealloc_Bits()		{
	if (nomsBits)
		free(nomsBits);
	if (bitsActives)
		free(bitsActives);
	nomsBits=NULL;
	bitsActives=NULL;
}

BOOL IsAllocated_Bits()			{
	if (nomsBits && bitsActives)
		return TRUE;
	else
		return FALSE;
}


LRESULT CALLBACK DlgBits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	int etat;
	MAP (*bloc)[1024];

	switch (message)
	{
		case WM_INITDIALOG:
			hDlgBits=hDlg;
			fenBits=1;
			Alloc_Bits();

			bloc=(MAP (*)[1024])BufferActif();
			if (bloc)
				SetBits(bloc[0][0]);
			return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDC_CHECK1)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK1,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x8000);
			}
			else if (LOWORD(wParam) == IDC_CHECK4)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK4,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x4000);
			}
			else if (LOWORD(wParam) == IDC_CHECK5)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK5,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x2000);
			}
			else if (LOWORD(wParam) == IDC_CHECK6)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK6,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x1000);
			}
			else if (LOWORD(wParam) == IDC_CHECK7)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK7,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x800);
			}
			else if (LOWORD(wParam) == IDC_CHECK8)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK8,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x400);
			}
			else if (LOWORD(wParam) == IDC_CHECK9)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK9,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x200);
			}
			else if (LOWORD(wParam) == IDC_CHECK10)		{
				etat=SendDlgItemMessage(hDlg,IDC_CHECK10,BM_GETCHECK,0,0);
				AppliqueMasque(etat,0x100);
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				ShowWindow(hDlg,SW_HIDE);
				return TRUE;
			}

			break;
	}

    return FALSE;
}

int GetParamOffset(int nParam)		{
	SD_PARAMS *sdp=&sdParams[gblSdModele];
	int i, r;
	r=0;
	for (i=0;i<nParam;i++)		{
		r += sdp->sdTaillesParam[i];
	}
	return r;
}

char *ExtraitNomParam(char *nom)		{
	char *lastS, *ptr;
	strcpy(str, nom);
	ptr=str;
	lastS=ptr;
	while(*ptr!='>' && *ptr)		{
		if (*ptr=='<')
			lastS=ptr+1;
		ptr++;
	}
	*ptr=0;
	return lastS;
}

LRESULT CALLBACK DlgAttributs(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	static HWND hStatics[MAX_SD], hTextes[MAX_SD];
	int i, j, nElement, nbreEls;
	char str[MAX_PATH];
	int *ptr;
	SD_PARAMS *sdp=&sdParams[gblSdModele];

	switch (message)
	{
		case WM_INITDIALOG:
			if (sdp->sdNumParams<=0)		{
				MessageBox(hDlg, "Vous devez d'abord définir des propriétés pour l'objet avant de pouvoir les éditer!", "Erreur", MB_ICONEXCLAMATION);
				EndDialog(hDlg, -1);
				break;
			}

			//Premier élément de la sélection multiple
			if (lstSelMulNbre)
				nElement = lstSelMulListe[0];
			else
				nElement = listeSelection;

			for (i=0;i<sdp->sdNumParams;i++)			{
				sprintf(str," %s", ExtraitNomParam(sdp->sdNomsParams[i]));
				hStatics[i]=CreateWindow ("Static", str, WS_BORDER | WS_CHILD | WS_VISIBLE,
					6,10+i*20,100,18, hDlg, NULL, hInst, NULL);
				SendMessage(hStatics[i],WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

				if (sdp->sdTypeParam[i]==SDT_ENTIER)			{
					ptr= (int*)((char*)(_SD(gblSpriteListe,nElement))->params+GetParamOffset(i));
					sprintf(str,"%i",(int)*ptr);
				}
				else if (sdp->sdTypeParam[i]==SDT_BRUT)			{
					char *cptr;
					cptr=(char*)(_SD(gblSpriteListe,nElement))->params+GetParamOffset(i);
					strcpy(str, cptr);
				}
				hTextes[i]=CreateWindow ("Edit", str, WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
					120,10+i*20,100,18, hDlg, NULL, hInst, NULL);
				SendMessage(hTextes[i],WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
			}
			RECT r1, r2;
			GetWindowRect(hDlg, &r1);
			GetClientRect(hDlg, &r2);
			SetWindowPos(hDlg, HWND_TOP, 0, 0, 230+((r1.right-r1.left)-(r2.right-r2.left)), 38+(i-1)*20+((r1.bottom-r1.top)-(r2.bottom-r2.top)), SWP_NOZORDER|SWP_NOMOVE);
			return TRUE;

		case WM_COMMAND:
			//Bouton ok
			if (LOWORD(wParam) == IDOK) 
			{
				if (lstSelMulNbre)
					nbreEls = lstSelMulNbre;
				else
					nbreEls = 1;

				//Support sélection multiple
				for (j=0;j<nbreEls;j++)		{
					if (lstSelMulNbre)
						nElement = lstSelMulListe[j];
					else
						nElement = listeSelection;
					for (i=0;i<sdp->sdNumParams;i++)			{
						if (sdp->sdTypeParam[i]==SDT_ENTIER)		{
							GetWindowText(hTextes[i],str,MAX_PATH);
							ptr= (int*)((char*)(_SD(gblSpriteListe,nElement))->params+GetParamOffset(i));
							*ptr=GetEntier(str);
						}
						else if (sdp->sdTypeParam[i]==SDT_BRUT)			{
							char *cptr;
							GetWindowText(hTextes[i],str,MAX_PATH);
							cptr=(char*)(_SD(gblSpriteListe,nElement))->params+GetParamOffset(i);
							str[GetParamOffset(i+1)-GetParamOffset(i)-1]=0;
							strcpy(cptr, str);
						}
					}
				}
				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}


LRESULT CALLBACK DlgAttributsElement(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{
	static int noElement;
	int i, j, nTrouve;
	char *texte;
	BOOL bMajListeRequise;
	HWND hCombo;
	int lookupTable[sizeof(types)/sizeof(types[0])];
	char tempTypes[1000];

	switch (message)
	{
		case WM_INITDIALOG:
			noElement = lParam;						//Passé en paramètre
			Dialog_SetText(hDlg, IDC_EDIT1, elements[noElement].nom_fichier);
			Dialog_SetText(hDlg, IDC_EDIT2, elements[noElement].nom_base);
			Dialog_SetText(hDlg, IDC_EDIT3, elements[noElement].nom_court);
			if (!(elements[noElement].type & DANS_DOSSIER))
				strcpy(elements[noElement].dossier, "");
			Dialog_SetText(hDlg, IDC_EDIT4, elements[noElement].dossier);
			j=0;
			for (i=0;i<sizeof(types)/sizeof(types[0]);i++)			{
				lookupTable[i]=j;
				if (i!=0 && i!=TYPE_SPRITE)			{
					Combo_AddItem(hDlg, IDC_COMBO1, types[i]);
					j++;
				}
			}
			Combo_SetValue(hDlg, IDC_COMBO1, lookupTable[elements[noElement].type&MASQUE_TYPE]);

			//Dossiers
			hCombo=GetDlgItem(hDlg,IDC_COMBO3);
			nTrouve = 0;
			SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"(Aucun)");
			j = 1;
			for (i=0;i<nbreElements;i++)		{
				if (elements[i].type&TYPE_DOSSIER)			{
					SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)elements[i].nom_court);
					if (!strcmp(elements[i].nom_court, elements[noElement].dossier))
						nTrouve = j;
					j++;
				}
			}
			SendMessage(hCombo,CB_SETCURSEL, nTrouve, 0);

			sprintf(str, "Propriétés de %s", elements[noElement].nom_court);
			SetWindowText(hDlg, str);
			return TRUE;

		case WM_COMMAND:

			if (LOWORD(wParam) == IDC_BUTTON1)			{
				sprintf(tempTypes, "%cFichiers GBA Graphics%c*%s;*%s;*%s;*%s;*%s;*%s%c%c",1,0,b16_def_ext, b8_def_ext, pal_def_ext, til_def_ext, map_def_ext, lst_def_ext,0,0);
				strcpy(str, "");
				if (SauveFichier(str, tempTypes))
					SetDlgItemText(hDlg,IDC_EDIT1, CreeNomRelatif(str));
			}
			if (LOWORD(wParam) == IDC_BUTTON6)			{
				strcpy(str, "");
				if (OuvreFichier(str,"\1Tous les fichiers\0*.*\0\0"))
					SetDlgItemText(hDlg,IDC_EDIT2, CreeNomRelatif(str));
			}

			if (LOWORD(wParam) == IDC_BUTTON7)			{
				i = IsWindowEnabled(GetDlgItem(hDlg, IDC_COMBO1));
				if (!i)		{
					j = MessageBox(hDlg, "Vous pouvez modifier le type de fichier, mais ceci est complètement déconseillé. Vous ne devriez le faire que si vous êtes absolument sûr de vous.\nVoulez-vous vraiment modifier le type de fichier?", "Avertissement", MB_ICONEXCLAMATION|MB_OKCANCEL|MB_DEFBUTTON2);
					if (j!=IDOK)
						break;
					EnableWindow(GetDlgItem(hDlg, IDC_COMBO1), TRUE);
					EnableWindow(GetDlgItem(hDlg, IDC_BUTTON7), FALSE);
				}
//				else
//					EnableWindow(GetDlgItem(hDlg, IDC_COMBO1), FALSE);
			}

			//Bouton ok
			if (LOWORD(wParam) == IDOK)
			{
				bMajListeRequise = FALSE;

				texte = Dialog_GetText(hDlg, IDC_EDIT1);
				if (strcmp(texte, elements[noElement].nom_fichier))				{
					if (!FichierExiste(texte) && FichierExiste(elements[noElement].nom_fichier))				{
						for (i=0;i<nbreElements;i++)		{
							if (!strcmp(elements[i].nom_fichier, elements[noElement].nom_fichier) && i!=noElement)
								break;
						}
						//Il est déjà utilisé ailleurs?
						if (i<nbreElements)
							CopyFile(elements[noElement].nom_fichier, texte, TRUE);
						else
							MoveFile(elements[noElement].nom_fichier, texte);
					}
					else if (FichierExiste(elements[noElement].nom_fichier))		{
						for (i=0;i<nbreElements;i++)		{
							if (!strcmp(elements[i].nom_fichier, elements[noElement].nom_fichier) && i!=noElement)
								break;
						}
						if (i>=nbreElements)		{
							j = fMsgBox(hDlg, "Question", MB_ICONQUESTION|MB_YESNOCANCEL|MB_DEFBUTTON3, "Le fichier actuel (%s) ne sera plus utilisé du tout dans le projet, voulez-vous le supprimer?", elements[noElement].nom_fichier);
							if (j==IDCANCEL)
								break;
							if (j==IDYES)
								EffaceVersCorbeille(elements[noElement].nom_fichier);
						}
					}
					strcpy(elements[noElement].nom_fichier, texte);
				}

				texte = Dialog_GetText(hDlg, IDC_EDIT2);
				if (strcmp(texte, elements[noElement].nom_base))
					strcpy(elements[noElement].nom_base, texte);

				texte = Dialog_GetText(hDlg, IDC_EDIT3);
				if (strcmp(texte, elements[noElement].nom_court))			{
					strcpy(elements[noElement].nom_court, texte);
					bMajListeRequise = TRUE;
				}

				texte = Dialog_GetText(hDlg, IDC_COMBO3);
				i = Combo_GetValue(hDlg, IDC_COMBO3);
				if ((i!=0 && strcmp(texte, elements[noElement].dossier)) || (i==0 && elements[noElement].dossier[0]))			{
					if (i > 0)
						elements[noElement].type |= DANS_DOSSIER;
					else
						elements[noElement].type &= ~DANS_DOSSIER;
					strcpy(elements[noElement].dossier, texte);
					bMajListeRequise = TRUE;
				}

				texte = Dialog_GetText(hDlg, IDC_COMBO1);
				i = -1;
				for (j=0;j<sizeof(types)/sizeof(types[0]);j++)			{
					if (!strcmp(types[j], texte))
						i = j;
				}

				if (i!=(elements[noElement].type&MASQUE_TYPE) && i>=0)			{
					elements[noElement].type &= ~MASQUE_TYPE;
					elements[noElement].type |= i;
					bMajListeRequise = TRUE;
				}

				if (bMajListeRequise)			{
					EffaceElementArbre(noElement);
					AjouteElementArbre(noElement);
//					MajListe(gblHDlg);
				}

				//Dialogue terminé
				EndDialog(hDlg, IDOK);
				return TRUE;
			}

			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, IDCANCEL);
				return TRUE;
			}

			break;
	}

    return FALSE;
}


