// GBAEdit.cpp : Defines the entry point for the application.
//

#define GBA_GRAPHICS_VERSION "0.99 (build 2.12)"

#define _CRT_SECURE_NO_DEPRECATE

//#include "stdafx.h"
#include <windows.h>
#include "resource.h"
#include <commdlg.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>

#define EffaceEcran(Bits)	memset(Bits,0,LARG_BUF*HAUT_BUF*3)

//Ouah! Des variables globales avant même les includes! Qui dit mieux?
HWND gblHDlg;
int Editer=FALSE, Quitter=FALSE;

#include "definitions.h"
#include "fonctions.h"
#include "graphique.h"
#include "lecture.h"
#include "conversion.h"
#include "editeurDeMap.h"
#include "unfichierdeplus.h"
#include "config.h"
#include "avec_gdiplus.h"
#include "import.h"

//Prototypes de certaines fonctions.
LRESULT CALLBACK Boite(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
void Conversions();
void DessinePalette(unsigned char *palette, int nbCoul);

#include "sauvegarde.h"

void FichierProjetActif(char *fichier)		{
	strcpy(fichierProjet, fichier);
	GetFullPathName(fichierProjet, sizeof(str), str, NULL);
	strcpy(fichierProjet, str);
	JusteChemin(str);
	SetCurrentDirectory(str);
}


HACCEL hAccelTable, hAccelEdit;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;
	HWND hWnd;
	HMENU hMenu;
	HDC hdcEcran;
	LPSTR cmdLine;

 	// TODO: Place code here.
	nbreElements=0;
	editeurOuvert=0;
	hInst=hInstance;
	bGdiPlusDemarre=0;

	hChargement=CreateDialog(hInst,(LPCTSTR)IDD_CHARGEMENT,NULL,NULL);
	SetWindowPos(hChargement,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

	GetCurrentDirectory(sizeof(cInitialDir), cInitialDir);
	cmdLine = GetCommandLine();
	strcpy(cInitialDir, cmdLine);
	if (cInitialDir[0]=='\"')
		memmove(cInitialDir, cInitialDir+1, sizeof(cInitialDir)-1);
	GetNomDossier(cInitialDir);

	//Recherche si GDIPLUS existe
	char tempbufr[1024], *nomcourt;
	if (SearchPath(NULL, "gdiplus.dll", NULL, sizeof(tempbufr), tempbufr, &nomcourt))
		bGdiPlusEnabled=1;
	else
		bGdiPlusEnabled=0;

	//Initialisation des globales
			CopieX=CopieY=0;
			profondeurSel=1;
			CopieSpec=0;
			blocBase=0;
			tileX=tileY=8;
			blocCopie=0;
			messages=0;
			proprePalette=1;
			fondTransparent=0;
			nuances=31;
			format_appliquer[0]=0;
			editTiming=10;
			CreeCouleurs();
			nomsBits=NULL;
			bitsActives=NULL;
			bTil32Bits=0;
			nElementSelectionne=-1;
			bEtatDupliqueElement=0;
			gblHDlg=0;
			//Important: DlgExec stocke un static char *contenu!
			bInviteScriptContenuSauve=0;

	sdParams=(SD_PARAMS*)malloc(sizeof(SD_PARAMS)*MAX_SD_MODELES);
	memset(sdParams, 0, sizeof(SD_PARAMS)*MAX_SD_MODELES);
	strcpy(sdParams[0].sdNomModele, "Default");
	sdNbreModeles=1;
	sdParams[0].sizeofSD=sizeof(SPRITE_DEF);

	elements = (ELEMENT*)malloc(sizeof(ELEMENT)*MAXEL);

	notification=1;
	if (*lpCmdLine=='\"')		{
		memmove(lpCmdLine,lpCmdLine+1,strlen(lpCmdLine)-1);
		lpCmdLine[strlen(lpCmdLine)-2]=0;
		strcpy(fichierProjet,lpCmdLine);
	}
	else if (*lpCmdLine && *lpCmdLine!='-')
		strcpy(fichierProjet,lpCmdLine);
	else
		strcpy(fichierProjet,"projet.pgg");
//		strcpy(fichierProjet,"");
	GetFullPathName(fichierProjet, sizeof(str), str, NULL);
	strcpy(fichierProjet, str);
	JusteChemin(str);
	SetCurrentDirectory(str);

	nb_sections=0;
	LitFormat(&formats[0]);
	strcpy(formats[0].nom,"Standard");
	nb_sections++;

	DefFormat(&formats[0]);

//	LitFiltre();

	memset(dossierParDefaut,0,sizeof(dossierParDefaut));

	InitCommonControls();
	hfCourier=CreateFont(14, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, VARIABLE_PITCH | FF_DONTCARE, "Courier new"); 
	strcpy(fichierConfigAOuvrir,"script.spt");
	strcpy(fichierAide,"lisezmoi.htm");
	ChargeProjet(fichierProjet);
	FichierProjetActif(fichierProjet);
	CopieSymTable();
	hdcEcran = GetDC(NULL);
	hdcImage2=CreateCompatibleDC(hdcEcran);
	CreeDIB(hdcImage2,LARG_BUF,HAUT_BUF,24,&hbm2,(void**)&Bits2);
	ReleaseDC(NULL,hdcEcran);

	if (*lpCmdLine=='-')		{
		char *suite;
		do		{
			suite=lpCmdLine;
			while(*suite!=':' && *suite)			{
				if (*suite=='\"')		{
					suite++;
					while(*suite!='\"' && *suite)
						suite++;
					if (*suite)
						suite++;
				}
				else
					suite++;
			}
			if (*suite==':')
				*suite++=0;
			FctConv(lpCmdLine);
			lpCmdLine=suite;
		} while(*suite);
		SauveProjet(fichierProjet);
		return 0;
	}

	hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDR_ACCELERATOR1);
	hAccelEdit=LoadAccelerators(hInstance,(LPCTSTR)IDR_ACCELERATOR2);

	hWnd=CreateDialog(hInstance,(LPCTSTR)IDD_BOITE,NULL,(DLGPROC)Boite);
	
	hMenu=GetSubMenu(GetMenu(hWnd),4);
	hProcedures=hMenu;
	DeleteMenu(hMenu,0,MF_BYPOSITION);
	AjouteProcedures(fichierConfigAOuvrir,hMenu);

	tooltip_CreateTooltip();

	Quitter=FALSE;
	while (GetMessage(&msg, NULL, 0, 0)/* && !Quitter*/)
	{
		if (!TranslateAccelerator(hWnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return 0;
}


//Attention! Dessine la fenêtre principale avec son contenu dynamique à droite
//hItem contient l'élément sélectionné dans l'arbre du projet
void DessFenetre(HWND hDlg, HANDLE hItem)		{
	RECT rect;
	unsigned char *palette;
	unsigned long *motifs;
	MAP *map;
	char str[100];
	int i, ancselection, nCoul;

	if (g_majListeEnCours)
		return;
	//Redimensionne la DIB
//	RedimDIB(1024,1024);

	bRedimDIBOverflow = FALSE;
//	FenInvisible();
	//Détruit tous les contrôles. On les redessinera après si nécessaire.
	DestroyWindow(hBoutonParcourir);
	DestroyWindow(hTexte01);
	DestroyWindow(hBoutonOk);
	DestroyWindow(hStatic01);
	DestroyWindow(hRadioTexte);
	DestroyWindow(hRadioRotation);
	DestroyWindow(hStatic02);
	DestroyWindow(hTexte02);
	DestroyWindow(hBoutonParcourir2);
	DestroyWindow(hStatic03);
	DestroyWindow(hTexte03);
	DestroyWindow(hBoutonParcourir3);
	DestroyWindow(hStatic04);
	DestroyWindow(hTexte04);
	DestroyWindow(hBoutonParcourir4);
	DestroyWindow(hComboPalette);
	DestroyWindow(hCheckPal);
	DestroyWindow(hComboTileset);
	DestroyWindow(hCheckTileset);
	DestroyWindow(hCheckMap);
	DestroyWindow(hStatic05);
	DestroyWindow(hTexte05);
	DestroyWindow(hStatic06);
	DestroyWindow(hComboTaille);
	DestroyWindow(hCheckOptimise);
	DestroyWindow(hComboTiles);
	DestroyWindow(hComboTileBits);
	DestroyWindow(hComboTypeMap);
	DestroyWindow(hStatic07);
	DestroyWindow(hBoutonReinit);
	DestroyWindow(hComboModeles);

	//On les met à zéro, comme ça on est sûr que si on les détruit à nouveau, Windows ne fera pas n'importe quoi...
	hBoutonParcourir=hTexte01=hBoutonOk=hStatic01=hRadioTexte=hRadioRotation=hTexte02=hStatic02=hBoutonParcourir2=hStatic03=hTexte03=hBoutonParcourir3=hStatic04=hTexte04=hBoutonParcourir4=
		hComboPalette=hCheckPal=hComboTileset=hCheckTileset=hCheckMap=hStatic05=hTexte05=hStatic06=hComboTaille=hCheckOptimise=hComboTiles=hComboTileBits=hComboTypeMap=hStatic07=hBoutonReinit=
		hComboModeles=0;

	//Création d'un rectangle
	rect.left=BASEFEN_X;
	rect.top=BASEFEN_Y;
	rect.bottom=BASEFEN_X;
	rect.right=BASEFEN_Y;
	//Notez l'idiotie de ces 4 lignes de codes

	//Sauvegarde de la sélection (si une bitmap a été dessiné directement sur la fenêtre
	//il faudra ensuite l'effacer complètement)
	ancselection=selection;

	//Le dossier Mosaïques a été sélectionné.
	if (hItem==htvMosaiques)		{
		//C'est moi ou bien il fait chaud tout à coup par ici...
		//Bon ben tout ça ça crée les contrôles de la page de droite, met leur texte et
		//leur polices aux valeurs voulues...

		//Sélection est une variable globale de référence pour savoir où on en est.
		selection=SEL_MOSAIQUES;
		//cTitre est la chaîne du titre à dessiner dans le rectangle style Final Fantasy 7
		cTitre="Récupérer les mosaïques";
		//Crée les contrôles de base pour l'entrée d'un fichier
		CreeEntreeFichier(hDlg);
		//Sauf que là ça ne suffit pas...
		SetWindowText(hStatic02,"Destination pour les mosaïques");
		hStatic03=CreateWindow ("Static", "Destination pour la palette",WS_CHILD | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+80,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hTexte03=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+95,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hTexte03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hBoutonParcourir3=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+95,70,18, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonParcourir3,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hStatic04=CreateWindow ("Static", "Destination pour la map",WS_CHILD | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+120,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic04,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hTexte04=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+135,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hTexte04,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hBoutonParcourir4=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+135,70,18, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonParcourir4,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

/*		hRadioTexte=CreateWindow("Button", "Type texte",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+165,120,18, hDlg, NULL, hInst, NULL);
		SendMessage(hRadioTexte,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hRadioRotation=CreateWindow("Button", "Type rotation",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+183,120,18, hDlg, NULL, hInst, NULL);
		SendMessage(hRadioRotation,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		SendMessage(hRadioTexte,BM_SETCHECK,TRUE,0);*/

		hStatic07=CreateWindow ("Static", "Type de map",WS_CHILD | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+165,120,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic07,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		hComboTypeMap=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+183,120,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboTypeMap,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Rotation (8 bits)");
		SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Texte (16 bits)");
#ifdef SUPPORT_MAPS_32_BITS
		SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Etendue (32 bits)");
#endif
		SendMessage(hComboTypeMap,CB_SETCURSEL,1,0);


		hCheckPal=CreateWindow ("Button", "Palette existante",WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
			BASEFEN_X+150,BASEFEN_Y+168,100,18, hDlg, NULL, hInst, NULL);
		SendMessage(hCheckPal,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hComboPalette=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED,
			BASEFEN_X+262,BASEFEN_Y+165,120,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboPalette,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		if (CalcNombreObjets(TYPE_PALETTE)==0)
			EnableWindow(hCheckPal,FALSE);

		hCheckTileset=CreateWindow ("Button", "Tileset existant",WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
			BASEFEN_X+150,BASEFEN_Y+190,100,18, hDlg, NULL, hInst, NULL);
		SendMessage(hCheckTileset,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hComboTileset=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED,
			BASEFEN_X+262,BASEFEN_Y+187,120,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboTileset,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		if (CalcNombreObjets(TYPE_MOSAIQUE)==0)
			EnableWindow(hCheckTileset,FALSE);

		hCheckMap=CreateWindow ("Button", "Générer une map",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
			BASEFEN_X+150,BASEFEN_Y+212,102,18, hDlg, NULL, hInst, NULL);
		SendMessage(hCheckMap,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		SendMessage(hCheckMap,BM_SETCHECK,TRUE,0);

		hStatic05=CreateWindow ("Static", "Couleurs / max.",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
			BASEFEN_X+150,BASEFEN_Y+238,130,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hTexte05=CreateWindow ("Edit", "255",WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+350,BASEFEN_Y+236,30,18, hDlg, NULL, hInst, NULL);
		SendMessage(hTexte05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hStatic06=CreateWindow ("Static", "Taille de la map",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+212,150,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic06,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hComboTaille=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+230,120,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboTaille,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hCheckOptimise=CreateWindow ("Button", "Tileset optimisé",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
			BASEFEN_X,BASEFEN_Y+270,102,18, hDlg, NULL, hInst, NULL);
		SendMessage(hCheckOptimise,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		SendMessage(hCheckOptimise,BM_SETCHECK,TRUE,0);

		hComboTileBits=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
			BASEFEN_X+240,BASEFEN_Y+236,100,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboTileBits,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		SendMessage(hComboTileBits,CB_ADDSTRING,0,(LPARAM)"4 bits (16 coul.)");
		SendMessage(hComboTileBits,CB_ADDSTRING,0,(LPARAM)"8 bits (256 coul.)");
		SendMessage(hComboTileBits,CB_ADDSTRING,0,(LPARAM)"15 bits (32k coul.)");
		SendMessage(hComboTileBits,CB_SETCURSEL,1,0);

		hComboTiles=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
			BASEFEN_X+105,BASEFEN_Y+269,80,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboTiles,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hBoutonOk=CreateWindow ("Button", "Ok!",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		//Ca va vous tenez le coup?

		//Remplit les zones de liste avec les palettes et les jeux de mosaïques disponibles
		AjouteTypes();
		AjoutePalettesTilesets();
		AjouteTaillesBlocs();
		SendMessage(hComboTiles,CB_SETCURSEL,0,0);
	}
	//Le dossier Sprites a été sélectionné
	else if (hItem==htvListes)		{
		selection=SEL_LISTES;
		if (CalcNombreObjets(TYPE_MOSAIQUE)==0)			{			//Nombre de tilesets insuffisant
			cTitre="Il faut au moins un jeu de mosaïques pour cela!";
		}
		else		{
			cTitre="Créer une nouvelle liste d'objets";

			hStatic01=CreateWindow ("Static", "Fichier à créer",WS_CHILD | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y,300,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hTexte01=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
				BASEFEN_X,BASEFEN_Y+15,300,18, hDlg, NULL, hInst, NULL);
			SendMessage(hTexte01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hBoutonParcourir=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+310,BASEFEN_Y+15,70,18, hDlg, NULL, hInst, NULL);
			SendMessage(hBoutonParcourir,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic04=CreateWindow ("Static", "Tileset à utiliser",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y+79,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic04,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboTileset=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X,BASEFEN_Y+95,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboTileset,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic05=CreateWindow ("Static", "Modèle à utiliser",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X+130,BASEFEN_Y+79,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboModeles=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X+130,BASEFEN_Y+95,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboModeles,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic06=CreateWindow ("Static", "Taille des blocs",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X+260,BASEFEN_Y+79,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic06,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboTiles=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X+260,BASEFEN_Y+95,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboTiles,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			AjouteTilesets();
			AjouteModeles();
			AjouteTaillesBlocs();
			SendMessage(hComboTiles,CB_SETCURSEL,1,0);

			hBoutonOk=CreateWindow ("Button", "Ok!",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
			SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		}
	}
	//Dossier Cartes/Bitmaps
	else if (hItem==htvBitmaps)		{
		selection=SEL_NULL;
		//Ceux-ci ne servent à rien si ce n'est à être ouverts...
		cTitre="Cliquez sur le + pour ouvrir le menu";
		InvalidateRect(hDlg,&rect,0);
	}
	//Dossier Bitmaps 8 bits
	else if (hItem==htvBitmaps8)		{
		selection=SEL_BITMAPS8;
		cTitre="Créer une bitmap pour le mode 4";
		CreeEntreeFichier(hDlg);

		//Bon ben là c'est plus ou moins toujours le même principe hein...
		SetWindowText(hStatic02,"Destination pour la bitmap");
		hStatic03=CreateWindow ("Static", "Destination pour la palette",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+80,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hTexte03=CreateWindow ("Edit", "",WS_BORDER | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X,BASEFEN_Y+95,300,18, hDlg, NULL, hInst, NULL);
		SendMessage(hTexte03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hBoutonParcourir3=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+95,70,18, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonParcourir3,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hStatic05=CreateWindow ("Static", "Nombre de couleurs maximum",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
			BASEFEN_X,BASEFEN_Y+127,150,18, hDlg, NULL, hInst, NULL);
		SendMessage(hStatic05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hTexte05=CreateWindow ("Edit", "255",WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+160,BASEFEN_Y+125,30,18, hDlg, NULL, hInst, NULL);

		SendMessage(hTexte05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hCheckPal=CreateWindow ("Button", "Palette existante",WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
			BASEFEN_X,BASEFEN_Y+148,100,18, hDlg, NULL, hInst, NULL);
		SendMessage(hCheckPal,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		hComboPalette=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED,
			BASEFEN_X+112,BASEFEN_Y+148,120,180, hDlg, NULL, hInst, NULL);
		SendMessage(hComboPalette,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

		if (CalcNombreObjets(TYPE_PALETTE)==0)
			EnableWindow(hCheckPal,FALSE);

		AjoutePalettesTilesets();

		hBoutonOk=CreateWindow ("Button", "Ok!",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
	}
	//Bitmaps 16 bits
	else if (hItem==htvBitmaps16)		{
		selection=SEL_BITMAPS16;
		cTitre="Créer une bitmap pour les modes 3 et 5";
		CreeEntreeFichier(hDlg);
		// :baille:
		hBoutonOk=CreateWindow ("Button", "Ok!",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
			BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
		SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
	}
	//Cartes
	else if (hItem==htvCartes)		{
		selection=SEL_CARTES;

		if (CalcNombreObjets(TYPE_MOSAIQUE)==0)			{			//Nombre de tilesets insuffisant
			cTitre="Il faut au moins un jeu de mosaïques et une palette pour cela!";
		}
		else		{
			cTitre="Créer un nouveau tableau à utiliser comme carte géante";

			hStatic01=CreateWindow ("Static", "Fichier à créer",WS_CHILD | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y,300,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hTexte01=CreateWindow ("Edit", "",WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
				BASEFEN_X,BASEFEN_Y+15,300,18, hDlg, NULL, hInst, NULL);
			SendMessage(hTexte01,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hBoutonParcourir=CreateWindow("Button", "Parcourir...",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+310,BASEFEN_Y+15,70,18, hDlg, NULL, hInst, NULL);
			SendMessage(hBoutonParcourir,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			//Contrôles supplémentaires à créer
			hStatic02=CreateWindow ("Static", "Taille du tableau (l,h [blocs])",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y+50,300,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic02,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hTexte02=CreateWindow ("Edit", "1",WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+165,BASEFEN_Y+48,28,18, hDlg, NULL, hInst, NULL);
			SendMessage(hTexte02,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hTexte03=CreateWindow ("Edit", "1",WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+200,BASEFEN_Y+48,28,18, hDlg, NULL, hInst, NULL);
			SendMessage(hTexte03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic04=CreateWindow ("Static", "Tileset à utiliser",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y+125,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic04,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboTileset=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X,BASEFEN_Y+143,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboTileset,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic05=CreateWindow ("Static", "Palette à utiliser",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X+130,BASEFEN_Y+125,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic05,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboPalette=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X+130,BASEFEN_Y+143,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboPalette,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic06=CreateWindow ("Static", "Taille des blocs",WS_CHILD | ES_AUTOHSCROLL | WS_VISIBLE,
				BASEFEN_X+260,BASEFEN_Y+125,95,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic06,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hComboTiles=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X+260,BASEFEN_Y+143,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboTiles,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

			hStatic07=CreateWindow ("Static", "Type de map",WS_CHILD | WS_VISIBLE,
				BASEFEN_X,BASEFEN_Y+77,120,18, hDlg, NULL, hInst, NULL);
			SendMessage(hStatic07,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
			hComboTypeMap=CreateWindow("ComboBox", "",WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,
				BASEFEN_X,BASEFEN_Y+95,120,180, hDlg, NULL, hInst, NULL);
			SendMessage(hComboTypeMap,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
			SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Rotation (8 bits)");
			SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Texte (16 bits)");
	#ifdef SUPPORT_MAPS_32_BITS
			SendMessage(hComboTypeMap,CB_ADDSTRING,0,(LPARAM)"Etendue (32 bits)");
	#endif
			SendMessage(hComboTypeMap,CB_SETCURSEL,1,0);

			AjoutePalettesTilesets();
			AjouteTaillesBlocs();
			SendMessage(hComboTiles,CB_SETCURSEL,1,0);

			hBoutonOk=CreateWindow ("Button", "Ok!",WS_CHILD | WS_VISIBLE | WS_TABSTOP,
				BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
			SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
		}
}
	//Dossier Palettes.
	else if (hItem==htvPalettes)		{
		selection=SEL_PALETTES;
		cTitre="Les palettes sont générées avec les conversions d'images";
		InvalidateRect(hDlg,&rect,0);
	}
	//Ce n'est pas un dossier mais certainement un élément du projet.
	else	{
		//Là on vérifie si le handle est l'un des éléments du projet
		for (i=0;i<nbreElements;i++)		{
			if (elements[i].hti==hItem)
				break;
		}
		//Pas trouvé. Normalement ça ne devrait pas arriver mais on ne sait jamais...
		if (i==nbreElements)		{
			selection=SEL_AUCUNE;
			cTitre="Erreur interne!";
			InvalidateRect(hDlg,&rect,0);
		}
		else	{
			int type;
//			FenVisible();
			//Affiche cela
			TravailEnCours();
			if (elements[i].type&TYPE_DOSSIER)
				type=-1;
			else
				type=((elements[i].type)&MASQUE_TYPE);
			nElementSelectionne = i;

			//Là maintenant on teste dans quelle catégorie cet élément se trouve...
			if (type==TYPE_BITMAP16)		{
				//En voyant ce type de sélection, mon appli va repeindre la fenêtre en
				//copiant l'hdcImage2 dessus.
				selection=SEL_BITMAP_16;
				//Le nom de fichier devient le titre
				cTitre=(char*)elements[i].nom_fichier;
				//On lit la bitmap (et en fait l'affiche en même temps)
				LitBmp16(i);
				//On crée le bouton Éditeur.
/*				hBoutonOk=CreateWindow ("Button", "Editeur",WS_CHILD | WS_VISIBLE,
					BASEFEN_X+310,BASEFEN_Y+270,70,20, hDlg, NULL, hInst, NULL);
					SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));*/
				//Affiche la taille de l'image en-dessous de la bitmap.
				sprintf(str,"Taille: %ix%i",tailleX,tailleY);
				hStatic03=CreateWindow ("Static", str,WS_CHILD | WS_VISIBLE,
					BASEFEN_X,BASEFEN_Y+300,230,18, hDlg, NULL, hInst, NULL);
					SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
				InvalidateRect(hDlg,&rect,0);
			}
			else if (type==TYPE_BITMAP8)		{
				selection=SEL_BITMAP_8;
				cTitre=(char*)elements[i].nom_fichier;
				//Lecture 8 bits (va également charger une palette)
				LitBmp8(i);
				//Crée le bouton Éditeur.
/*				hBoutonOk=CreateWindow ("Button", "Editeur",WS_CHILD | WS_VISIBLE,
					BASEFEN_X+310,BASEFEN_Y+270,70,20, hDlg, NULL, hInst, NULL);
					SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));*/
				//Affiche la taille de l'image.
				sprintf(str,"Taille: %ix%i",tailleX,tailleY);
				hStatic03=CreateWindow ("Static", str,WS_CHILD | WS_VISIBLE,
					BASEFEN_X,BASEFEN_Y+300,230,18, hDlg, NULL, hInst, NULL);
					SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
				//Invalide l'affichage ('faudra le redessiner ensuite)
				InvalidateRect(hDlg,&rect,0);
			}
			//Une palette est sélectionnée
			else if (type==TYPE_PALETTE)		{
				selection=SEL_PALETTE;
				cTitre=(char*)elements[i].nom_fichier;
				palette=(unsigned char*)malloc(3*256);
				//Les résultats lus sont stockés dans hdcImage2 qui contient une DIB
				nCoul=LitPalette(palette,cTitre);
				if (!nCoul)
					goto pasbon;
				//LitPalette sert à charger la palette. DessinePalette la dessine.
				DessinePalette(palette,nCoul);
				//Affiche le nombre de couleurs
				sprintf(str,"%i couleurs",nCoul);
				hStatic03=CreateWindow ("Static", str,WS_CHILD | WS_VISIBLE,
					BASEFEN_X,BASEFEN_Y+300,230,18, hDlg, NULL, hInst, NULL);
					SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
				//Crée un bouton Éditeur
/*				hBoutonOk=CreateWindow ("Button", "Editeur",WS_CHILD | WS_VISIBLE,
					BASEFEN_X+310,BASEFEN_Y+270,70,20, hDlg, NULL, hInst, NULL);
					SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));*/
				free(palette);
				//Invalide l'affichage
				InvalidateRect(hDlg,&rect,0);
			}
			//Une mosaïque est sélectionnée
			else if (type==TYPE_MOSAIQUE)		{
				selection=SEL_MOSAIQUE;
				cTitre=(char*)elements[i].nom_fichier;
				palette=(unsigned char*)malloc(3*256);
//				motifs=(unsigned char*)malloc(tileX*tileY*TILEMAX);
				motifs=NULL;

				//Lecture du tileset (va également charger une palette)
				if (!LitTileset(palette,&motifs,elements[i].nom_fichier,0))
					goto pasbon;

				DessineTileset(palette,motifs);
				//Crée le bouton Éditeur.
/*				hBoutonOk=CreateWindow ("Button", "Editeur",WS_CHILD | WS_VISIBLE,
					BASEFEN_X+310,BASEFEN_Y+270,70,20, hDlg, NULL, hInst, NULL);
					SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));*/
				//Affiche le nombre de mosaïques calculé
				sprintf(str,"%i mosaïques",taille);
				hStatic03=CreateWindow ("Static", str,WS_CHILD | WS_VISIBLE,
					BASEFEN_X,BASEFEN_Y+300,230,18, hDlg, NULL, hInst, NULL);
					SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
				free(palette);
				if (motifs)
					free(motifs);
				//Invalide l'affichage ('faudra le redessiner ensuite)
				InvalidateRect(hDlg,&rect,0);
			}
			//Une carte est sélectionnée
			else if (type==TYPE_CARTE)		{
				selection=SEL_CARTE;
				cTitre=(char*)elements[i].nom_fichier;

				if (editeurOuvert)
					Editer=0;

				if (!Editer)		{
					palette=(unsigned char*)malloc(3*256);
//					motifs=(unsigned char*)malloc(tileX*tileY*TILEMAX);
					motifs=NULL;

					//Lecture de la map (va également charger une palette et un tileset)
					map=NULL;
					if (!LitMap(palette,&motifs,&map,i))		{
						Editer=0;
						goto pasbon;
					}

					//Affiche la taille de l'image.
					sprintf(str,"Taille: %ix%i blocs",tailleX,tailleY);
					hStatic03=CreateWindow ("Static", str,WS_CHILD | WS_VISIBLE,
						BASEFEN_X,BASEFEN_Y+300,230,18, hDlg, NULL, hInst, NULL);
						SendMessage(hStatic03,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

					//Dessine la map
//					EffaceEcran(Bits2);
					ColoreCadre(Bits2,0,0,LARG,HAUT,cFond);
					DessineMap(palette,motifs,map);

					//Crée le bouton Éditeur.
					hBoutonOk=CreateWindow ("Button", "Éditer",WS_CHILD | WS_VISIBLE,
						BASEFEN_X+310,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
						SendMessage(hBoutonOk,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));

					//Crée le bouton Effacer.
					char nom_fichier[MAX_PATH];
					//Efface le fichier .spt de config de l'éditeur de maps
					GetNomFichierConfigMap(nom_fichier, elements[nElementSelectionne].nom_fichier);
					hBoutonReinit=CreateWindow ("Button", "Config.",WS_CHILD | WS_VISIBLE,
						BASEFEN_X+230,BASEFEN_Y+296,70,20, hDlg, NULL, hInst, NULL);
					SendMessage(hBoutonReinit,WM_SETFONT,(WPARAM)hFonte,MAKELPARAM(1, 0));
					if (!FichierExiste(nom_fichier))
						EnableWindow(hBoutonReinit, FALSE);
				}

				if (Editer)		{
					HWND hWnd;
					MSG msg;

					Editer=0;
					gblPal=NULL;
					gblMotifs=NULL;
					gblMap=NULL;
					num_edit=i;
					FenMAJ();
//					DialogBox(hInst,(LPCTSTR)IDD_EDITEUR,hDlg,(DLGPROC)DlgEditeur);

					hWnd=CreateDialog(hInst,(LPCTSTR)IDD_EDITEUR,hDlg,(DLGPROC)DlgEditeur);
					while (GetMessage(&msg, NULL, 0, 0) && !Quitter)
					{
						if (!TranslateAccelerator(hWnd, hAccelEdit, &msg))
						{
							TranslateMessage(&msg);
							DispatchMessage(&msg);
						}
					}
					SetFocus(hDlg);

//					free(gblMap);
				}
				else		{
					if (map)
						free(map);
					if (palette)
						free(palette);
					if (motifs)
						free(motifs);
				}

				//Invalide l'affichage
				InvalidateRect(hDlg,&rect,0);
			}
			//Une liste est sélectionnée
			else if (type==TYPE_LISTE)		{
				selection=-1;
				cTitre=(char*)elements[i].nom_fichier;
				InvalidateRect(hDlg,&rect,0);
				goto pasbon;
			}
			else		{
				selection=-1;
				sprintf(chneTitre,"Répertoire personnel %s",elements[i].nom_court);
				cTitre=chneTitre;
				InvalidateRect(hDlg,&rect,0);
				goto pasbon;
			}

			GereBarresDefil(hDlg);
pasbon:
			TravailTermine();
		}
	}
	bImageTropGrosse = bRedimDIBOverflow;
	FenMAJ();
}

char *CreeNomRelatif(char *nom_srce)		{
	char tampon[MAX_PATH];
	int i,j;
	GetCurrentDirectory(MAX_PATH,tampon);
	j=strlen(tampon);
	if (strncmp(nom_srce,tampon,j)==0)	{
		strcpy(nom_srce,nom_srce+j+1);
		return nom_srce;
	}
	for (i=j-1;i>=0;i--)		{
		if (tampon[i]=='\\')
			break;
	}
	if (i<=0)		{
		return nom_srce;
	}
	if (tampon[i-1]==':')		{
		return nom_srce;
	}
	tampon[i]=0;
	j=i;
	if (strncmp(nom_srce,tampon,j)!=0)	{
		return nom_srce;
	}
	memmove(nom_srce+3,nom_srce+j+1,MAX_PATH-j-1);
	nom_srce[0]='.';
	nom_srce[1]='.';
	nom_srce[2]='\\';
	return nom_srce;
}


//Le bouton cliqué est inconnu au bataillon (il s'agit généralement d'un bouton dynamique)
//Cette fonction leur donne une raison d'exister. ;)
void GereBoutonInconnu(HWND hDlg, HWND hCtrl)		{
	//Noms de fichiers (nan sincèrement?)
	char nom_srce[MAX_PATH], nom_dest[MAX_PATH], nom_court[MAX_PATH],
		str[100];						//Sans oublier la fameuse 'str', gravée en moi, qui est utilisée comme chaîne temporaire ou pour sprintf, etc. :)
	int nCoul,i,j;
	//Variables temporaires
	ELEMENT els[10];					//Eléments à passer aux fonctions de conversion
	FILE *ecri;
	HTREEITEM hti;
	int noModele;

	optimiseTil=optimisePal=FALSE;

	if (selection==SEL_CARTES)		{
		if (hCtrl==hBoutonParcourir)		{
			memset(nom_srce,0,sizeof(nom_srce));
			if (SauveFichier(nom_srce,"\1Fichiers code C\0*.c\0\0"))		{
				AjouteExtension(nom_srce, map_def_ext);
				SetWindowText(hTexte01,CreeNomRelatif(nom_srce));
			}
		}
	}
	else if (selection==SEL_LISTES)		{
		if (hCtrl==hBoutonParcourir)		{
			memset(nom_srce,0,sizeof(nom_srce));
			if (SauveFichier(nom_srce,"\1Fichiers code C\0*.c\0\0"))		{
				AjouteExtension(nom_srce, lst_def_ext);
				SetWindowText(hTexte01, CreeNomRelatif(nom_srce));
			}
		}
	}
	else if (selection==SEL_BITMAPS8 || selection==SEL_BITMAPS16 || selection==SEL_MOSAIQUES)		{
		//Bouton parcourir n°1
		if (hCtrl==hBoutonParcourir)		{
			char *chneOfn;
			memset(nom_srce,0,sizeof(nom_srce));
			if (bGdiPlusEnabled)
				chneOfn="\1Fichiers image (.bmp, .png, .jpg, .gif, .tif)\0*.bmp;*.png;*.jpg;*.gif;*.tif\0\0";
			else
				chneOfn="\1Fichiers bitmap\0*.bmp\0\0";
			if (SauveFichier(nom_srce, chneOfn))		{
				CreeNomRelatif(nom_srce);
				SetWindowText(hTexte01,nom_srce);

				//On va parcourir la chaîne depuis la fin à la recherche du . de l'extension
				for (i=strlen(nom_srce)-1;i>=0;i--)
					if (nom_srce[i]=='.')	{			//Il est là!
						nom_srce[i]=0;					//Maintenant c'est la fin de la chaîne
						break;							//La boucle est terminée
					}

				//Ici le but est de compléter automatiquement les autres noms de fichiers
				//à partir du fichier source en utilisant les extensions prévues.
				strcpy(nom_dest,nom_srce);
				if (selection==SEL_BITMAPS8)		{		//Mode 8 bits: 2 paramètres
					strcat(nom_dest,b8_def_ext);
					SetWindowText(hTexte02,nom_dest);
					strcpy(nom_dest,nom_srce);
					strcat(nom_dest,pal_def_ext);
					SetWindowText(hTexte03,nom_dest);
				}
				else if (selection==SEL_BITMAPS16)		{	//Mode 16 bits: 1 paramètre
					strcat(nom_dest,b16_def_ext);
					SetWindowText(hTexte02,nom_dest);
				}
				else if (selection==SEL_MOSAIQUES)		{	//Mode de mosaïques: 3 paramètres
					strcat(nom_dest,til_def_ext);
					SetWindowText(hTexte02,nom_dest);
					strcpy(nom_dest,nom_srce);
					strcat(nom_dest,pal_def_ext);
					SetWindowText(hTexte03,nom_dest);
					strcpy(nom_dest,nom_srce);
					strcat(nom_dest,map_def_ext);
					SetWindowText(hTexte04,nom_dest);
				}
			}
		}
		//Bouton parcourir n°2
		else if (hCtrl==hBoutonParcourir2)		{
			memset(nom_srce,0,sizeof(nom_srce));
			if (SauveFichier(nom_srce,"\1Fichiers code C\0*.c\0\0"))		{
				CreeNomRelatif(nom_srce);
				SetWindowText(hTexte02,nom_srce);

				//Ici le but est de compléter automatiquement les autres noms de fichiers
				//à partir du fichier source en utilisant les extensions prévues.
				for (i=0;i<(signed)strlen(nom_srce);i++)
					if (nom_srce[i]=='.')	{			//Il est là!
						nom_srce[i]=0;					//Maintenant c'est la fin de la chaîne
						break;
					}
				strcpy(nom_dest,nom_srce);
				if (selection==SEL_BITMAPS8)		{		//Mode 8 bits: 2 paramètres
					strcat(nom_dest,pal_def_ext);
					SetWindowText(hTexte03,nom_dest);
				}
				else if (selection==SEL_MOSAIQUES)		{	//Mode de mosaïques: 3 paramètres
					strcat(nom_dest,pal_def_ext);
					SetWindowText(hTexte03,nom_dest);
					strcpy(nom_dest,nom_srce);
					strcat(nom_dest,map_def_ext);
					SetWindowText(hTexte04,nom_dest);
				}
			}
		}
		//Bouton parcourir n°3
		else if (hCtrl==hBoutonParcourir3)		{
			memset(nom_srce,0,sizeof(nom_srce));
			if (SauveFichier(nom_srce,"\1Fichiers code C\0*.c\0\0"))
				SetWindowText(hTexte03,CreeNomRelatif(nom_srce));
		}
		//Bouton parcourir n°4 ^^
		else if (hCtrl==hBoutonParcourir4)		{
			memset(nom_srce,0,sizeof(nom_srce));
			if (SauveFichier(nom_srce,"\1Fichiers code C\0*.c\0\0"))
				SetWindowText(hTexte03,CreeNomRelatif(nom_srce));
		}
	}

	if (hCtrl==hBoutonReinit)		{
		int choix;
		RECT rect;
		HMENU hmenu;

		if (selection==SEL_CARTE)		{
			char nom_fichier[MAX_PATH];
			//Détermine le fichier .spt de config de l'éditeur de maps
			GetNomFichierConfigMap(nom_fichier, elements[nElementSelectionne].nom_fichier);

			hmenu=CreatePopupMenu();
			AppendMenu(hmenu,MF_STRING, OM_OUVRIR, "Ouvrir");
			AppendMenu(hmenu,MF_STRING, OM_SUPPRIMER, "Supprimer");
			GetWindowRect(hCtrl, &rect);
			choix=TrackPopupMenu(hmenu,TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, rect.left, rect.bottom, 0, hDlg, NULL);
			DestroyMenu(hmenu);

			if (choix == OM_OUVRIR)		{
				sprintf(str,"notepad \"%s\"", nom_fichier);
				WinExec(str, 1);
			}
			else if (choix == OM_SUPPRIMER)		{
				EffaceVersCorbeille(nom_fichier);
				EnableWindow(hBoutonReinit, FALSE);
			}
		}
	}
	//Bouton ok/éditer
	else if (hCtrl==hBoutonOk)		{
		AnnuleNomVar();						//Le nom doit être redéfini à chaque fois sinon ce sera celui par défaut
		TravailEnCours();
		if (selection==SEL_CARTE)		{
			Editer=TRUE;
			hti=TreeView_GetSelection(hArbre);
			DessFenetre(gblHDlg,hti);
			DessFenetre(gblHDlg,hti);
		}
		else if (selection==SEL_CARTES)		{
			GetWindowText(hTexte01,nom_dest,MAX_PATH);

			strcpy(els[0].nom_base,nom_dest);
			strcpy(els[0].nom_fichier,nom_dest);

			faitNomCourt(nom_dest,nom_court);
			strcpy(els[0].nom_court,nom_court);

			els[0].type=TYPE_CARTE;

			GetWindowText(hTexte02,str,MAX_PATH);
			tailleX=atoi(str);
			GetWindowText(hTexte03,str,MAX_PATH);
			tailleY=atoi(str);

			i=SendMessage(hComboTypeMap,CB_GETCURSEL,0,0);
			ModeTexte=i;

			i=SendMessage(hComboPalette,CB_GETCURSEL,0,0);
			i=TrouveNiemeElement(TYPE_PALETTE,i+1);
			utilPalette=i;

			i=SendMessage(hComboTileset,CB_GETCURSEL,0,0);
			i=TrouveNiemeElement(TYPE_MOSAIQUE,i+1);
			bUtilTileset=i;

			LitComboTiles();

/*			tailleX*=tileX;
			tailleY*=tileY;*/
			ecri=fopen(nom_dest,"wb");
			if (ecri)		{
				ReinitSymTable();
				PrepareSymTable(2);
				VerifNomVar(els[0].nom_court,chneNomVarMap);
				InitSymbole(0,els[0].nom_base);								//%file%
				i=tailleX*tailleY;
				if (ModeTexte==2)
					InitSymbole(4,tailleX*tailleY*4);						//%memory%
				else if (ModeTexte==1)
					InitSymbole(4,tailleX*tailleY*2);						//%memory%
				else
					InitSymbole(4,tailleX*tailleY);							//%memory%
				InitSymbole(5,chneNomVarMap);								//%name%
				InitSymbole(6,elements[bUtilTileset].nom_fichier);			//%link%
				if (ModeTexte==0)
					InitSymbole(9,8);										//%depth%
				else if (ModeTexte==1)
					InitSymbole(9,16);										//%depth%
				else if (ModeTexte==2)
					InitSymbole(9,32);										//%depth%
				if (ModeTexte==2)
					InitSymbole(10,type32);									//%type%
				else if (ModeTexte)
					InitSymbole(10,type16);									//%type%
				else
					InitSymbole(10,type8);									//%type%

				EcritChaineFiltree(map_declaration,ecri);
				for (j=0;j<tailleY;j++)		{
					for (i=0;i<tailleX;i++)		{
						if (map_nbChaqueX>0 && i>0 && i%map_nbChaqueX==0)
							EcritChaineFiltree(map_chaque_x,ecri);

						if (ModeTexte==2)
							myprintf(ecri,map_chaque_valeur_3,0);
						else if (ModeTexte==1)
							myprintf(ecri,map_chaque_valeur_1,0);
						else
							myprintf(ecri,map_chaque_valeur_2,0);

			//			nEcrits++;
					}
					EcritChaineFiltree(map_fin_ligne,ecri);
				}
				EcritChaineFiltree(map_fin_declaration,ecri);

				fclose(ecri);
				AjouteAuProjet(els[0]);
/*				sprintf(str,"//%s\n"
					"//Converti avec GBA Graphics par Brünni\n"
					"//Map (\"%s\",\"%s\")\n"
					"//Taille: %i*%i * %i*%i\n"
					"//Mémoire: %i octets\n\n"
					"const unsigned %s %s_map[%i]=	{\n"
					,nom_dest,
					elements[utilPalette].nom_fichier,elements[bUtilTileset].nom_fichier,
					tileX,tileY,tailleX/tileX,tailleY/tileY,
					(tailleX/tileX)*(tailleY/tileY)*2,
					"short",
					els[0].nom_court,(tailleX/tileX)*(tailleY/tileY));
				fputs(str,ecri);
				fputs("};\n",ecri);
				fclose(ecri);
				AjouteAuProjet(els[0]);*/
			}
			else		{
				CacheTravail();
				MessageBox(gblHDlg,"Impossible d'écrire le fichier spécifié.\nVérifiez que le nom est correct et que vous avez les droits d'accès suffisants",nom_dest,MB_ICONERROR);
			}
		}
		else if (selection==SEL_LISTES)		{
			GetWindowText(hTexte01,nom_dest,MAX_PATH);

			strcpy(els[0].nom_base,nom_dest);
			strcpy(els[0].nom_fichier,nom_dest);

			faitNomCourt(nom_dest,nom_court);
			strcpy(els[0].nom_court,nom_court);

			els[0].type=TYPE_LISTE;

			i=SendMessage(hComboTileset,CB_GETCURSEL,0,0);
			i=TrouveNiemeElement(TYPE_MOSAIQUE,i+1);
			bUtilTileset=i;

			LitComboTiles();

			noModele = SendMessage(hComboModeles,CB_GETCURSEL,0,0);

			tailleX*=tileX;
			tailleY*=tileY;

			ecri=fopen(nom_dest,"wb");

			if (ecri)		{
				ReinitSymTable();
				PrepareSymTable(2);
				InitSymbole(0,nom_dest);									//%file%
				InitSymbole(3,0);											//%size%
				InitSymbole(4,0);											//%memory%
				InitSymbole(5,nom_court);									//%name%
				InitSymbole(6,elements[bUtilTileset].nom_fichier);			//%link%
				InitSymbole(10,typesd);										//%type%
				InitSymbole(15,sdParams[noModele].sdNomModele);				//%model%

				EcritChaineFiltree(lst_declaration,ecri);
				EcritChaineFiltree(lst_fin_declaration,ecri);

				fclose(ecri);
				AjouteAuProjet(els[0]);
			}
			else		{
				CacheTravail();
				MessageBox(gblHDlg,"Impossible d'écrire le fichier spécifié.\nVérifiez que le nom est correct et que vous avez les droits d'accès suffisants",nom_dest,MB_ICONERROR);
			}
		}
		else if (selection==SEL_BITMAPS16)		{
			GetWindowText(hTexte01,nom_srce,MAX_PATH);
			GetWindowText(hTexte02,nom_dest,MAX_PATH);

			strcpy(els[0].nom_base,nom_srce);
			strcpy(els[0].nom_fichier,nom_dest);

			faitNomCourt(nom_dest,nom_court);
			strcpy(els[0].nom_court,nom_court);

			els[0].type=TYPE_BITMAP16;

			if (PasteImage(els[0].nom_base,&tailleX,&tailleY,0))		{
				if (ConvertitBmp16(els))		{					//Si la conversion a réussi
					AjouteAuProjet(els[0]);
				}
			}
		}
		else if (selection==SEL_BITMAPS8)		{
			GetWindowText(hTexte05,str,100);
			nCoul=atoi(str);
			if (nCoul<1 || nCoul>255)	{
				CacheTravail();
				MessageBox(gblHDlg,"Le nombre de couleurs entré n'est pas valide (1<=n<=255)","Oups...",MB_ICONERROR);
			}
			else	{
				j=SendMessage(hCheckPal,BM_GETCHECK,0,0);
				if (j!=BST_UNCHECKED)		{
					i=SendMessage(hComboPalette,CB_GETCURSEL,0,0);
					i=TrouveNiemeElement(TYPE_PALETTE,i+1);
					utilPalette=i;
					if (j==BST_CHECKED)
						optimisePal=TRUE;
					else
						optimisePal=FALSE;
				}
				else
					utilPalette=-1;

				GetWindowText(hTexte01,nom_srce,MAX_PATH);
				GetWindowText(hTexte02,nom_dest,MAX_PATH);
				strcpy(els[0].nom_base,nom_srce);
				strcpy(els[0].nom_fichier,nom_dest);

				faitNomCourt(nom_dest,nom_court);
				strcpy(els[0].nom_court,nom_court);
				els[0].type=TYPE_BITMAP8;

				if (PasteImage(els[0].nom_base,&tailleX,&tailleY,1))		{
					if (utilPalette>=0)
						strcpy(nom_dest,elements[utilPalette].nom_fichier);
					else
						GetWindowText(hTexte03,nom_dest,MAX_PATH);

					strcpy(els[1].nom_base,nom_srce);
					strcpy(els[1].nom_fichier,nom_dest);

					faitNomCourt(nom_dest,nom_court);

					strcpy(els[1].nom_court,nom_court);
					els[1].type=TYPE_PALETTE;

					if (ConvertitBmp8(els,nCoul))			{
/*						if (utilPalette>=0)
							EffaceElement(utilPalette);*/

						AjouteAuProjet(els[0]);
						AjouteAuProjet(els[1]);
					}
//					strcpy(elements[nbreElements-1].nom_palette,nom_dest);
				}
				else		{
					CacheTravail();
					MessageBox(gblHDlg,"Impossible de charger le fichier bitmap spécifié","Erreur",MB_ICONERROR);
				}
			}
		}
		else if (selection==SEL_MOSAIQUES)		{
//			MessageBox(hDlg,"C'est marqué que ce n'est pas implémenté (ça signifie que ce n'est pas disponible pour le moment).\nJe ferai de mon mieux pour que ça le soit le plus rapidement possible... :-)","Secrétaire blonde détectée!",MB_ICONEXCLAMATION);
			GetWindowText(hTexte01,nom_srce,MAX_PATH);

			//On va questionner le bouton radio "Mode texte".
			j=SendMessage(hComboTypeMap,CB_GETCURSEL,0,0);
			ModeTexte=j;

			//Mode 16 couleurs... (16 palettes de 16)
//			j=SendMessage(hCheck16,BM_GETCHECK,0,0);
			j=SendMessage(hComboTileBits,CB_GETCURSEL,0,0);
			b16coul=0, bTil32Bits=0;
			if (j==0)
				b16coul=1;
			else if (j==2)
				bTil32Bits=1;

			//Générer une map?
			if (SendMessage(hCheckMap,BM_GETCHECK,0,0)==BST_CHECKED)
				bGenereMap=TRUE;
			//Si ce n'est pas lui qui est sélectionné alors c'est le mode rotation
			else
				bGenereMap=FALSE;

			//Optimiser le tileset?
			if (SendMessage(hCheckOptimise,BM_GETCHECK,0,0)==BST_CHECKED)
				bOptimiseTileset=TRUE;
			//Si ce n'est pas lui qui est sélectionné alors c'est le mode rotation
			else
				bOptimiseTileset=FALSE;

			j=SendMessage(hCheckPal,BM_GETCHECK,0,0);
			if (j!=BST_UNCHECKED)		{
				i=SendMessage(hComboPalette,CB_GETCURSEL,0,0);
				i=TrouveNiemeElement(TYPE_PALETTE,i+1);
				utilPalette=i;
				if (j==BST_CHECKED)
					optimisePal=TRUE;
				else
					optimisePal=FALSE;
			}
			else
				utilPalette=-1;

			j=SendMessage(hCheckTileset,BM_GETCHECK,0,0);
			if (j!=BST_UNCHECKED)		{
				i=SendMessage(hComboTileset,CB_GETCURSEL,0,0);
				i=TrouveNiemeElement(TYPE_MOSAIQUE,i+1);
				bUtilTileset=i;
				if (j==BST_CHECKED)
					optimiseTil=TRUE;
				else
					optimiseTil=FALSE;
			}
			else
				bUtilTileset=-1;

			i=SendMessage(hComboTaille,CB_GETCURSEL,0,0);

			if (i==0)
				tailleVoulueX=tailleVoulueY=0;
			else if (i==1)
				tailleVoulueX=tailleVoulueY=128;
			else if (i==2)
				tailleVoulueX=tailleVoulueY=256;
			else if (i==3)
				tailleVoulueX=tailleVoulueY=512;
			else if (i==4)
				tailleVoulueX=tailleVoulueY=1024;

			GetWindowText(hTexte05,str,100);
			nCoul=atoi(str);

			LitComboTiles();

			if (nCoul<1 || nCoul>255)	{
				CacheTravail();
				MessageBox(gblHDlg,"Le nombre de couleurs entré n'est pas valide (1<=n<=255)","Oups...",MB_ICONERROR);
			}
			else	{
				if (bUtilTileset>=0)
					strcpy(nom_dest,elements[bUtilTileset].nom_fichier);
				else
					GetWindowText(hTexte02,nom_dest,MAX_PATH);


				strcpy(els[0].nom_base,nom_srce);
				strcpy(els[0].nom_fichier,nom_dest);

				faitNomCourt(nom_dest,nom_court);
				strcpy(els[0].nom_court,nom_court);

				EffaceEcran(Bits2);

				if (PasteImage(els[0].nom_base,&tailleX,&tailleY,1))		{
					if (tailleVoulueX==0 && tailleVoulueY==0 && (tailleX%tileX || tailleY%tileY))		{
						CacheTravail();
						if (MessageBox(NULL,"Les dimensions de la bitmap (hauteur et largeur) devraient être multiples de 8.\nLes bords seront complétés par la couleur 0...","Oups",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
							goto perdu;
						AffTravail();
					}

					if (utilPalette>=0)
						strcpy(nom_dest,elements[utilPalette].nom_fichier);
					else
						GetWindowText(hTexte03,nom_dest,MAX_PATH);

					strcpy(els[1].nom_base,nom_srce);
					strcpy(els[1].nom_fichier,nom_dest);

					faitNomCourt(nom_dest,nom_court);
					strcpy(els[1].nom_court,nom_court);

					GetWindowText(hTexte04,nom_dest,MAX_PATH);

					strcpy(els[2].nom_base,nom_srce);
					strcpy(els[2].nom_fichier,nom_dest);

					faitNomCourt(nom_dest,nom_court);
					strcpy(els[2].nom_court,nom_court);

					els[0].type=TYPE_MOSAIQUE;
					els[1].type=TYPE_PALETTE;
					els[2].type=TYPE_CARTE;

					if (ConvertitTiles(els,nCoul))			{
/*						if (utilPalette>=0)
							EffaceElement(utilPalette);

						if (bUtilTileset>=0)
							EffaceElement(bUtilTileset);*/

						AjouteAuProjet(els[0]);
						if (!bTil32Bits)					//Pas de palette en mode 32 bits
							AjouteAuProjet(els[1]);
						if (bGenereMap)
							AjouteAuProjet(els[2]);
					}
				}				//Fin if image collée
			}					//Fin if nCoul valide
		}						//Fin if selection mosaïques
perdu:
		TravailTermine();
	}
}

#include <shellapi.h>

void MajBoutons(HWND hBt)		{
	int i;
	if (hBt==hCheckPal)			{
		//La case est-elle cochée? 
		i=SendMessage(hCheckPal,BM_GETCHECK,0,0);
		//Activer ou désactiver le contrôle en fonction de la valeur de la case
		if (i!=BST_UNCHECKED)		{
			EnableWindow(hComboPalette,TRUE);
			EnableWindow(hTexte03,FALSE);
			EnableWindow(hBoutonParcourir3,FALSE);
		}
		else		{
			EnableWindow(hComboPalette,FALSE);
			EnableWindow(hTexte03,TRUE);
			EnableWindow(hBoutonParcourir3,TRUE);
		}
	}
	else if (hBt==hCheckTileset)			{
		//La case est-elle cochée? 
		i=SendMessage(hCheckTileset,BM_GETCHECK,0,0);
		//Activer ou désactiver le contrôle en fonction de la valeur de la case
		if (i!=BST_UNCHECKED)		{
			EnableWindow(hComboTileset,TRUE);
			EnableWindow(hTexte02,FALSE);
			EnableWindow(hBoutonParcourir2,FALSE);
		}
		else		{
			EnableWindow(hComboTileset,FALSE);
			EnableWindow(hTexte02,TRUE);
			EnableWindow(hBoutonParcourir2,TRUE);
		}
	}
	else if (hBt==hCheckMap)			{
		//La case est-elle cochée? 
		i=SendMessage(hCheckMap,BM_GETCHECK,0,0);
		//Activer ou désactiver le contrôle en fonction de la valeur de la case
		if (i==BST_CHECKED)		{
			EnableWindow(hTexte04,TRUE);
			EnableWindow(hBoutonParcourir4,TRUE);
			EnableWindow(hComboTaille,TRUE);
		}
		else		{
			EnableWindow(hTexte04,FALSE);
			EnableWindow(hBoutonParcourir4,FALSE);
			EnableWindow(hComboTaille,FALSE);
		}
	}
/*	else if (hBt==hRadioRotation)
		SendMessage(hRadioTexte,BM_SETCHECK,0,0);
	else if (hBt==hRadioTexte)
		SendMessage(hRadioRotation,BM_SETCHECK,0,0);*/
}

//Remplace tous les pixels d'une couleur par une autre
void AnalyseImage(int x, int y, int tX, int tY, unsigned int couleursrc, unsigned int couleurdst)			{
	int i,j;
	unsigned char r,v,b;

	for (j=y;j<y+tY;j++)
		for (i=x;i<x+tX;i++)			{
			LitPixRVB(Bits2,i,j,&r,&v,&b);
			if (RGB(r,v,b)==couleursrc)
				DessPix(Bits2,i,j,couleurdst);
		}
}

void SauveBmpPressePapiers()		{
	HDC hdcTemp;
	HBITMAP hbmTemp;
	int x,y, c;
	HDC hdcEcran;			//Releasé

	hdcEcran=GetDC(NULL);
	hdcTemp=CreateCompatibleDC(hdcEcran);
	//A remplacer par les tailles max. du buffer
//	x=tailleX>DIMENSION_MAX?DIMENSION_MAX:tailleX;
//	y=tailleY>DIMENSION_MAX?DIMENSION_MAX:tailleY;
	x=LARG;
	y=HAUT;

	AnalyseImage(scrollX,scrollY,x,y,cFond,RGB(rougeMasque,vertMasque,bleuMasque));
	hbmTemp=CreateCompatibleBitmap(hdcEcran,x,y);
//	hbmTemp = CreateBitmap(x, y, 1, 32, NULL);
	SelectObject(hdcTemp,hbmTemp);
	BitBlt(hdcTemp,0,0,x,y,hdcImage2,0,0,SRCCOPY);
	OpenClipboard(GetFocus());
	EmptyClipboard();
	SetClipboardData(CF_BITMAP,hbmTemp);
	CloseClipboard();

	AnalyseImage(scrollX,scrollY,x,y,RGB(rougeMasque,vertMasque,bleuMasque),cFond);

	c = GetPixel(hdcTemp, 0,0);
	SetPixel(hdcTemp, 0,0, RGB(1,0,254));
	if (GetPixel(hdcTemp, 0,0) != RGB(1,0,254))		{
		MessageBox(gblHDlg, "Pour un résultat optimal, vous devriez paramétrer les couleurs de votre écran en 24 ou 32 bits. Le mode actuel n'est pas assez précis pour stocker l'image et des informations comme la couleur transparente ont été perdues.\nSi cela ne fonctionne toujours pas, utilisez la fonction exporter l'image.", "Attention", MB_ICONEXCLAMATION);
	}
	SetPixel(hdcTemp, 0,0, c);
	DeleteObject(hbmTemp);
	DeleteDC(hdcTemp);
	ReleaseDC(NULL,hdcEcran);
}

void SauveBmpDisque()		{
	int x,y;
	char nom_srce[MAX_PATH];

	memset(nom_srce, 0, sizeof(nom_srce));
//	if (SauveFichier(str,"\1Fichiers image (.bmp, .png, .jpg, .gif, .tif)\0*.bmp;*.jpg;*.gif;*.tif\0\0"))		{
	if (SauveFichier(nom_srce, "\5Fichiers image (.bmp, .png, .jpg, .gif, .tif)\0*.bmp;*.png;*.jpg;*.gif;*.tif\0\0"))		{
		//A remplacer par les tailles max. du buffer
	//	x=tailleX>DIMENSION_MAX?DIMENSION_MAX:tailleX;
	//	y=tailleY>DIMENSION_MAX?DIMENSION_MAX:tailleY;
		x=LARG;
		y=HAUT;

		AnalyseImage(scrollX,scrollY,x,y,cFond,RGB(rougeMasque,vertMasque,bleuMasque));
		GDIPLUS_SaveToDisk(hdcImage2, x,y, nom_srce);
		AnalyseImage(scrollX,scrollY,x,y,RGB(rougeMasque,vertMasque,bleuMasque),cFond);
	}
}

void MainTree_ClearLastHti(HTREEITEM lastSelectedHti)		{
	TVITEM tvi;
	if (lastSelectedHti)		{
		//Un élément était sélectionné -> on le déselectionne
		tvi.hItem = lastSelectedHti;
		tvi.mask = TVIF_STATE;
		tvi.stateMask = TVIS_DROPHILITED|TVIS_BOLD;
		tvi.state = 0;
		TreeView_SetItem(hArbre, &tvi); 
	}
}

void MainTree_DropTargetHti(HTREEITEM hti)		{
	TVITEM tvi;
	tvi.hItem = hti;
	tvi.mask = TVIF_STATE;
	tvi.stateMask = TVIS_DROPHILITED|TVIS_BOLD;
	tvi.state = TVIS_DROPHILITED|TVIS_BOLD;
//  tvi.iImage = g_nClosed; 
//  tvi.iSelectedImage = g_nClosed; 
	TreeView_SetItem(hArbre, &tvi);
}

void VerifFichierProjetExiste(char *str)			{
	if (!fichierProjet[0])
		DemandeSauveProjet(str);
	else
		strcpy(str, fichierProjet);
}

// "Handler" pour la boîte de dialogue
LRESULT CALLBACK Boite(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	LPNMHDR pnmh;
	LPNMTREEVIEW pnmtv;
	HDC hdcEcran, hdcFenetre;
	int i,j,r,v,b;
	static int posX=0, posY=0;
	char str[1000];
	int sCode, nPos;
	NMTVDISPINFO *ptvdi;
	HTREEITEM hti;
	ELEMENT el;
	TVHITTESTINFO thti;
	static int derI, dragDrop=-1;
	static HTREEITEM lastSelectedHti=NULL;
	POINT point;
	FILE *f;

	switch (message)
	{
		//Initialisation de la boîte de dialogue.
		//Crée les HDCs, les initialise, met toutes les choses à jour, etc.
		case WM_INITDIALOG:
/*			HIMAGELIST himl;
			if ((himl = ImageList_Create(0, 0, 
					FALSE, NUM_BITMAPS, 0)) == NULL) 
					return FALSE; */
//			ShowWindow(hDlg,SW_SHOW);
			hFonte=(HFONT)SendMessage(hDlg,WM_GETFONT,0,0);
			MajListe(hDlg);
			hdcEcran=GetDC(NULL);
			hdcImage1=CreateCompatibleDC(hdcEcran);
			hbm1=CreateCompatibleBitmap(hdcEcran,640,480);
			SelectObject(hdcImage1,hbm1);
			dragDrop=-1;

			//Dessine le dégradé à trois coins
			hdcFenetre=GetDC(hDlg);
			//Il y a deux méthodes ;)
/*			for (j=0;j<16;j++)		{
				for (i=0;i<380;i++)		{
					SetPixel(hdcImage,i,j,RVB(2*i/3-(10*j),2*(380-i)/5,10*j+54));
				}
			}*/
			//Voilà la deuxième
			for (j=0;j<16;j++)		{
				for (i=0;i<380;i++)		{
//					SetPixel(hdcImage1,i,j,RVB(25*(8-j)+i/12,20*(-7+j)+i/10,3*i/5));
					SetPixel(hdcImage1,i,j,RVB(3*i/5,20*(8-j)+i/12,25*(-7+j)+i/12));
//					SetPixel(hdcImage1,i,j,RVB(20*(8-j)+i/12,2*i/5,25*(-7+j)+i/12));
				}
			}
			//Dessine le bord arrondi
			j=GetPixel(hdcFenetre,BASEFEN_X,BASEFEN_Y);
			cFond=j;					//Sauver la couleur de fond
			DessineBlocArrondi();

			cTitre="Bienvenue! Sélectionnez un élément...";

//			TreeView_SelectItem(hArbre,NULL);
			hdcEdit=CreateCompatibleDC(hdcEcran);
			CreeDIB(hdcEdit,LARG_BUF,HAUT_BUF,24,&hbmEdit,(void**)&Bits3);

			hdcSpec=CreateCompatibleDC(hdcEcran);
			CreeDIB(hdcSpec,LARG_BUF,HAUT_BUF,24,&hbmSpec,(void**)&Bits4);

			hdcImage3=CreateCompatibleDC(hdcEcran);
			hbm1=CreateCompatibleBitmap(hdcEcran,380,16);
			SelectObject(hdcImage3,hbm1);

			gblHDlg=hDlg;
			hArbre=GetDlgItem(hDlg,IDC_PROJET);
//			TreeView_SelectItem(hArbre,NULL);

//			TravailTermine();
			derI=1;

			gblHDlg=hDlg;
			OuvreFichierConfig(fichierConfigAOuvrir,"onstart");
			if (arretdurgence==2 || !retourScript)
				SendMessage(hDlg,WM_CLOSE,0,0);
			else		{
//				FenVisible();
//				ShowWindow(hDlg,SW_SHOW);
//				FenMAJ();
				SetFocus(hDlg);
			}
			if (format_appliquer[0])
				ChoisitFormat(format_appliquer);
			if (modele_appliquer[0])
				ChoisitModele(modele_appliquer);
			DestroyWindow(hChargement);
			messages=1;

			ReleaseDC(hDlg,hdcFenetre);
			ReleaseDC(NULL,hdcEcran);

			return TRUE;

		case WM_DROPFILES:
			HDROP hDrop;
			hDrop=(HDROP)wParam;
			j=DragQueryFile(hDrop,(UINT)-1,NULL,0);
			for (i=0;i<j;i++)		{
				DragQueryFile(hDrop,i,str,sizeof(str));
				ImporteFichier(str);
			}
			break;

		//La souris a été déplacée
		case WM_MOUSEMOVE:
			if (dragDrop!=-1)			{
				//Drag and drop en cours
				GetCursorPos(&point);
				ScreenToClient(hArbre,&point);
				thti.pt.x=point.x;
				thti.pt.y=point.y;
				hti=TreeView_HitTest(hArbre,&thti);
				if (!hti)			{
					SetCursor(LoadCursor(NULL, IDC_NO));
					MainTree_ClearLastHti(lastSelectedHti);
					lastSelectedHti = 0;
					break;
				}
				else if (lastSelectedHti == 0)
					SetCursor(LoadCursor(NULL, IDC_UPARROW));
				for (i=0;i<nbreElements;i++)
					if (elements[i].hti==hti)
						break;
				if (i<nbreElements)		{					//Pas un des dossiers de base
					//Pas un dossier -> élément parent
					if (!(elements[i].type&TYPE_DOSSIER))		{
						hti = TreeView_GetParent(hArbre, hti);
						for (i=0;i<nbreElements;i++)
							if (elements[i].hti==hti)
								break;
					}
				}
				//Efface le dernier élément sélectionné
				if (lastSelectedHti!=hti)
					MainTree_ClearLastHti(lastSelectedHti);
				lastSelectedHti=hti;
				MainTree_DropTargetHti(hti);
			}
			else		{
				//Code normal
				posX=LOWORD(lParam);
				posY=HIWORD(lParam);

				if (posX<BASEFEN_X || posY<BASEFEN_Y ||
					posX>=BASEFEN_X+256 || posY>=BASEFEN_Y+256)
					break;

				hdcFenetre=GetDC(hDlg);
				SelectObject(hdcFenetre,hfCourier);

				if (selection==SEL_PALETTE)		{
					i=(tailleX/16)*((posY-BASEFEN_Y+scrollY)/16)+(posX-BASEFEN_X+scrollX)/16;
					j=(posY-BASEFEN_Y)/16;
					if (i>=0 && i<256 && j>=0 && j<tailleY)		{
						SetBkColor(hdcFenetre,cFond);
						SetTextColor(hdcFenetre,cFond^0xffffff);
						r=v=b=0;
						LitPixRVB(Bits2,(posX-BASEFEN_X)/16,(posY-BASEFEN_Y)/16,(UCHAR*)&r,(UCHAR*)&v,(UCHAR*)&b);
						if (RGB(r,v,b)!=(unsigned int)cFond)		{
							sprintf(str,"Idx: %02X hex",((posX-BASEFEN_X)/16)+16*((posY-BASEFEN_Y)/16));
							TextOut(hdcFenetre,BASEFEN_X+290,BASEFEN_Y+130,str,strlen(str));
							sprintf(str,"%03i,%03i,%03i",r/8,v/8,b/8);
							TextOut(hdcFenetre,BASEFEN_X+290,BASEFEN_Y+150,str,strlen(str));
						}
					}
				}
				else if (selection==SEL_MOSAIQUE || selection==SEL_CARTE)		{
					i=(posX-BASEFEN_X+scrollX)/tileX;
					j=(posY-BASEFEN_Y+scrollY)/tileY;
					if (i>=0 && i<tailleX/tileX && j>=0 && j<tailleY/tileY)				{
						StretchBlt(hdcFenetre,BASEFEN_X+302,BASEFEN_Y+78,64,64,hdcImage2,tileX*i,tileY*j,tileX,tileY,SRCCOPY);
						SetBkColor(hdcFenetre,cFond);
						SetTextColor(hdcFenetre,cFond^0xffffff);
						if (selection==SEL_MOSAIQUE)		{
							sprintf(str,"%03i  ",i+(tailleX/tileY)*j);
							TextOut(hdcFenetre,BASEFEN_X+322,BASEFEN_Y+146,str,strlen(str));
						}
						else	{
							sprintf(str,"%02i,%02i  ",i,j);
							TextOut(hdcFenetre,BASEFEN_X+316,BASEFEN_Y+146,str,strlen(str));
						}
					}
				}

			ReleaseDC(hDlg,hdcFenetre);
			}
			break;
		//Ce message est envoyé chaque fois que l'application doit être redessinée.
		case WM_PAINT:
			//Signale à Windows qu'on commence
			BeginPaint(hDlg,NULL);
			//Récupère le HDC du dialogue.
			hdcFenetre=GetDC(hDlg);
			//Récupère la couleur de fond
			//HACK!!!! Puisque les couleurs sur GBA sont des multiples de 8 (256 -> 32), il faut que la couleur de fond soit distingable. Avec ça elle sera impaire et donc forcément différente.
			i=GetPixel(hdcFenetre,0,0)|1;
			//La couleur de fond a changé?
			if (i!=cFond && i!=CLR_INVALID)		{
				cFond=i;
				DessineBlocArrondi();
			}
			//Dessine le titre
			DessTitre(hdcFenetre,cTitre);
			//Si la sélection représente une image, on va l'afficher
			if (selection==SEL_BITMAP_8 || selection==SEL_BITMAP_16 || selection==SEL_PALETTE || selection==SEL_CARTE || selection==SEL_MOSAIQUE)		{
				//L'image est stockée dans hdcImage2 (qui contient une DIB)
				i=tailleX>256?256:tailleX;
				j=tailleY>256?256:tailleY;
				if (selection==SEL_PALETTE)
					StretchBlt(hdcFenetre,BASEFEN_X,BASEFEN_Y,256,256,hdcImage2,0,0,16,16,SRCCOPY);
				else
					BitBlt(hdcFenetre,BASEFEN_X,BASEFEN_Y,i,j,hdcImage2,scrollX,scrollY,SRCCOPY);
			}
			ReleaseDC(hDlg,hdcFenetre);
			//Signale à Windows qu'on a fini.
			EndPaint(hDlg,NULL);
			break;

		case WM_VSCROLL:
			sCode = (int) LOWORD(wParam); // scroll bar value 
			nPos = (short int) HIWORD(wParam);  // scroll box position 

			//Vérifie ce qu'il s'est passé et modifie la variable en fonction de ça
			if (sCode==SB_LINEUP)
				scrollY-=32;
			if (sCode==SB_LINEDOWN)
				scrollY+=32;
			if (sCode==SB_PAGEUP)
				scrollY-=192;
			if (sCode==SB_PAGEDOWN)
				scrollY+=192;
			if (sCode==SB_BOTTOM)
				scrollY=32767;
			if (sCode==SB_TOP)
				scrollY=0;
			if (sCode==SB_THUMBTRACK || sCode==SB_THUMBPOSITION)
				scrollY=nPos;

			//Remet la position dans la gamme possible
			if (scrollY>tailleY-256)
				scrollY=tailleY-256;
			if (scrollY<0)
				scrollY=0;

			//Met à jour la barre.
			SetScrollPos(hStatic05,SB_CTL,scrollY,TRUE);
			//Récupère le HDC du dialogue.
			hdcFenetre=GetDC(hDlg);
			//Dessine la nouvelle image
			i=tailleX>256?256:tailleX;
			j=tailleY>256?256:tailleY;
			BitBlt(hdcFenetre,BASEFEN_X,BASEFEN_Y,i,j,hdcImage2,scrollX,scrollY,SRCCOPY);
			ReleaseDC(hDlg,hdcFenetre);
			break;

		case WM_HSCROLL:
			sCode = (int) LOWORD(wParam); // scroll bar value 
			nPos = (short int) HIWORD(wParam);  // scroll box position 

			//Vérifie ce qu'il s'est passé et modifie la variable en fonction de ça
			if (sCode==SB_LINEUP)
				scrollX-=32;
			if (sCode==SB_LINEDOWN)
				scrollX+=32;
			if (sCode==SB_PAGEUP)
				scrollX-=192;
			if (sCode==SB_PAGEDOWN)
				scrollX+=192;
			if (sCode==SB_BOTTOM)
				scrollX=32767;
			if (sCode==SB_TOP)
				scrollX=0;
			if (sCode==SB_THUMBTRACK || sCode==SB_THUMBPOSITION)
				scrollX=nPos;

			//Remet la position dans la gamme possible
			if (scrollX>tailleX-256)
				scrollX=tailleX-256;
			if (scrollX<0)
				scrollX=0;

			//Met à jour la barre.
			SetScrollPos(hStatic04,SB_CTL,scrollX,TRUE);
			//Récupère le HDC du dialogue.
			hdcFenetre=GetDC(hDlg);
			//Dessine la nouvelle image
			i=tailleX>256?256:tailleX;
			j=tailleY>256?256:tailleY;
			BitBlt(hdcFenetre,BASEFEN_X,BASEFEN_Y,i,j,hdcImage2,scrollX,scrollY,SRCCOPY);
			ReleaseDC(hDlg,hdcFenetre);
			break;

		//Fin d'un drag-drop
		case WM_LBUTTONUP:
			if (dragDrop!=-1)			{
				MainTree_ClearLastHti(lastSelectedHti);
				lastSelectedHti = 0;
				ReleaseCapture();
				GetCursorPos(&point);
				ScreenToClient(hArbre,&point);
				thti.pt.x=point.x;
				thti.pt.y=point.y;
				hti=TreeView_HitTest(hArbre,&thti);
				SetCursor(LoadCursor(NULL, IDC_ARROW));
				if (!hti || hti==elements[dragDrop].hti)			{
					dragDrop = -1;
					break;
				}

				if (elements[dragDrop].type & TYPE_DOSSIER)			{
					for (i=0;i<nbreElements;i++)
						if (elements[i].hti==hti)
							break;
					if (i<nbreElements)		{					//Pas un des dossiers de base
						//Pas un dossier -> élément parent
						if (!(elements[i].type&TYPE_DOSSIER))		{
							hti = TreeView_GetParent(hArbre, hti);
							for (i=0;i<nbreElements;i++)
								if (elements[i].hti==hti)
									break;
						}
					}
					if (i==nbreElements)		{					//Un des dossiers de base -> replace l'élément dans son lieu d'origine
						for (i=1;i<nbreDossiersBase;i++)		{
							if (*typesHTI[i].hti == hti)
								break;
						}
						if (i<nbreDossiersBase)			{
							CopieElement(el,elements[dragDrop]);
							el.hti=NULL;
							if (!strcmp(el.dossier, typesHTI[i].nom))			{	//Déjà le même dossier
								el.type&=~DANS_DOSSIER;
								strcpy(el.dossier, "");
							}
							else		{
								el.type|=DANS_DOSSIER;
								strcpy(el.dossier, typesHTI[i].nom);
							}
							CopieElement(elements[dragDrop], el);
							MajListe(hDlg);
						}
					}
					else if (!(elements[i].type&TYPE_DOSSIER))		{		//Pas un dossier -> impossible
						dragDrop = -1;
						break;
					}
					else		{									//Dans un dossier -> déplacement
						//Code récursif pour éviter qu'un dossier soit placé dans un sous-dossier de lui-même
						int k;
						k=i;
						j=i;
redo:
						if (!strcmp(elements[j].nom_court, elements[dragDrop].nom_court))			{
							dragDrop = -1;
							MessageBox(hDlg, "Vous ne pouvez pas déplacer un répertoire dans l'un de ses sous-répertoires!", "Erreur", MB_ICONERROR);
							break;
						}
						for (j=0;j<nbreElements;j++)		{
							if (elements[j].type & TYPE_DOSSIER && !strcmp(elements[j].nom_court, elements[k].dossier))			{
								k=j;
								goto redo;
							}
						}
						//End Code
						if (j>=nbreElements)		{
							CopieElement(el,elements[dragDrop]);
							el.type|=DANS_DOSSIER;
							el.hti=NULL;
							strcpy(el.dossier,elements[i].nom_court);
							CopieElement(elements[dragDrop], el);
							MajListe(hDlg);
							TreeView_EnsureVisible(hArbre, elements[dragDrop].hti);
						}
					}
				}
				else			{
					//Elément normal
					for (i=0;i<nbreElements;i++)
						if (elements[i].hti==hti)
							break;
					if (i<nbreElements)		{					//Pas un des dossiers de base
						//Pas un dossier -> élément parent
						if (!(elements[i].type&TYPE_DOSSIER))		{
							hti = TreeView_GetParent(hArbre, hti);
							for (i=0;i<nbreElements;i++)
								if (elements[i].hti==hti)
									break;
						}
					}
					if (i==nbreElements)		{					//Un des dossiers de base -> replace l'élément dans son lieu d'origine
						CopieElement(el,elements[dragDrop]);
						if (!(el.type&DANS_DOSSIER) && !dejaAvertiElementDossierBase)
							MessageBox(hDlg, "L'élément se trouve déjà dans le dossier par défaut pour ce type de fichier. Vous ne pouvez pas placer un élément dans un autre dossier de base que celui d'origine (par exemple une Carte dans le dossier Mosaïques).", "Note", MB_ICONINFORMATION);
						dejaAvertiElementDossierBase=1;
						el.type&=(~DANS_DOSSIER);
						el.hti=NULL;
						strcpy(el.dossier, "");
						EffaceElement(dragDrop);
						AjouteAuProjet(el);
					}
					else if (!(elements[i].type&TYPE_DOSSIER))		{		//Pas un dossier -> impossible
						dragDrop = -1;
						break;
					}
					else		{									//Dans un dossier -> déplacement
						CopieElement(el,elements[dragDrop]);
						el.type|=DANS_DOSSIER;
						el.hti=NULL;
						strcpy(el.dossier,elements[i].nom_court);
						EffaceElement(dragDrop);
						AjouteAuProjet(el);
		/*				elements[dragDrop].type|=DANS_DOSSIER;
						strcpy(elements[dragDrop].dossier,elements[i].nom_court);
						MajListe(hDlg);*/
					}
				}
				dragDrop = -1;
			}
			break;

		//Message de notification
		case WM_NOTIFY:
			pnmh = (LPNMHDR) lParam;
			//Si ça vient pas de l'arbre -> poubelle
			if (wParam==IDC_PROJET)		{
				//Quel code?
				switch (pnmh->code)		{
					case TVN_BEGINDRAG:
						pnmtv = (LPNMTREEVIEW) lParam;
						hti=pnmtv->itemNew.hItem;
						SetCursor(LoadCursor(NULL, IDC_UPARROW));
						if (!hti)
							break;
						for (i=0;i<nbreElements;i++)
							if (elements[i].hti==hti)
								break;
						if (i==nbreElements)
							break;
//						if (elements[i].type&TYPE_DOSSIER)
//							break;
						dragDrop=i;
					    SetCapture(GetParent(hTV)); 
						break;

					case TVN_BEGINLABELEDIT:
						HWND hEdit;
						ptvdi=(LPNMTVDISPINFO) lParam;
						hti=ptvdi->item.hItem;
/*						TVITEM tvi;
						tvi.hItem = hti;
						tvi.mask = TVIF_TEXT;
						tvi.pszText = "HELLO";
						TreeView_SetItem(hArbre, &tvi); */
						for (i=0;i<nbreElements;i++)
							if (elements[i].hti==hti)
								break;
						if (i==nbreElements)		{
							TreeView_EndEditLabelNow(hArbre,TRUE);
							break;
						}
/*						else if (elements[i].type&TYPE_DOSSIER)			{
							TreeView_EndEditLabelNow(hArbre,TRUE);
							break;
						}*/
						//Remet le nom complet dans l'editbox
						hEdit = TreeView_GetEditControl(hArbre);
						SetWindowText(hEdit, elements[i].nom_court);
						return FALSE;

					case TVN_ENDLABELEDIT:
						ptvdi=(LPNMTVDISPINFO) lParam;
						hti=ptvdi->item.hItem;
						for (i=0;i<nbreElements;i++)
							if (elements[i].hti==hti)
								break;
						if (i==nbreElements)		{
							goto erreur;
						}
						else		{
							if (elements[i].type & TYPE_DOSSIER)		{
								if (!ptvdi->item.pszText || !(*ptvdi->item.pszText))
									goto erreur;
								CopieElement(el, elements[i]);
								if (strlen(ptvdi->item.pszText)>=sizeof(elements->nom_court)-1)
									ptvdi->item.pszText[sizeof(elements->nom_court)-1]=0;
								strcpy(el.nom_court,ptvdi->item.pszText);
								//Remplace le dossier de tout ceux qui l'utilisent
								for (j=0;j<nbreElements;j++)		{
									//Etait dans ce dossier?
									if (!strcmp(elements[j].dossier, elements[i].nom_court))
										strcpy(elements[j].dossier, el.nom_court);
								}
								CopieElement(elements[i], el);
								MajListe(hDlg);
								TreeView_SelectItem(hArbre,elements[i].hti);
							}
							else	{
								if (!ptvdi->item.pszText || !(*ptvdi->item.pszText))			{
									if (bEtatDupliqueElement)
										EffaceElement(i);
									goto erreur;
								}
								CopieElement(el,elements[i]);
								EffaceElement(i);
								if (strlen(ptvdi->item.pszText)>=sizeof(elements->nom_court)-1)
									ptvdi->item.pszText[sizeof(elements->nom_court)-1]=0;
								strcpy(el.nom_court,ptvdi->item.pszText);
								if (bEtatDupliqueElement)		{
									char extension[MAX_PATH], dossier[MAX_PATH];
									strcpy(dossier, el.nom_fichier);
									GetNomDossier(dossier);
									strcpy(extension, GetWideExtension(el.nom_fichier));
									//Ne pas traduire
									sprintf(el.nom_fichier, "%s%s%s%s%s", dossier, dossier[0]?"\\":"", el.nom_court, extension[0]?".":"",extension);
									//Traduction possible
									CopyFile(elements[bEtatDupliqueElement-1].nom_fichier, el.nom_fichier, 1);
								}
								AjouteAuProjet(el);
								bEtatDupliqueElement=0;
								TreeView_SelectItem(hArbre,elements[nbreElements-1].hti);
							}
						}
erreur:
						bEtatDupliqueElement=0;
						break;
					case TVN_KEYDOWN:
						NMTVKEYDOWN *ptvkd;
						ptvkd = (LPNMTVKEYDOWN) lParam;
						hti=TreeView_GetSelection(hArbre);
						if (ptvkd->wVKey==VK_DELETE || ptvkd->wVKey==VK_F2)		{
							for (i=0;i<nbreElements;i++)
								if (elements[i].hti==hti)
									break;
							if (i==nbreElements)
								break;
							if (ptvkd->wVKey==VK_DELETE)		{
								if (elements[i].type&TYPE_DOSSIER)		{
									for (j=0;j<nbreElements;j++)		{
										if (!strcmp(elements[j].dossier,elements[i].nom_court))
											break;
									}
									if (j<nbreElements)		{
										if (MessageBox(gblHDlg,"Ce dossier n'est pas vide! Vous devriez d'abord supprimer les éléments qui s'y trouvent!\nVoulez-vous VRAIMENT le supprimer?","Attention!",MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)==IDNO)
											break;
									}
									EffaceElement(i);
								}
								else	{
									f=fopen(elements[i].nom_fichier,"rb");
									if (f)		{
										j = fMsgBox(gblHDlg, "Question", MB_ICONINFORMATION|MB_YESNOCANCEL|MB_DEFBUTTON2, "Supprimer l'élément définitivement, le fichier associé (%s) compris?", elements[i].nom_fichier);
										fclose(f);
									}
									else
										j=IDNO;
									if (j!=IDCANCEL)		{
										if (j==IDYES)		{
											EffaceVersCorbeille(elements[i].nom_fichier);
										}
										EffaceElement(i);
									}
								}
							}
							else if (ptvkd->wVKey==VK_F2)
								TreeView_EditLabel(hArbre,hti);
						}
						break;

					case TVN_SELCHANGED:
						//La sélection a changé. On redessine la fenêtre en signalant
						//la nouvelle sélection.
						pnmtv = (LPNMTREEVIEW) lParam;
						if (notification)
							DessFenetre(hDlg,pnmtv->itemNew.hItem);
						break;

					case NM_DBLCLK:
						GetCursorPos(&point);
						ScreenToClient(hArbre,&point);
						thti.pt.x=point.x;
						thti.pt.y=point.y;
						hti=TreeView_HitTest(hArbre,&thti);
						if (!hti)
							break;
//						TreeView_DeleteItem(hArbre,hti);
						for (i=0;i<nbreElements;i++)
							if (elements[i].hti==hti)
								break;
						if (i==nbreElements)
							break;
						if (elements[i].type&TYPE_DOSSIER)
							break;
						if (((elements[i].type)&MASQUE_TYPE)==TYPE_CARTE)		{
							Editer=TRUE;
							hti=TreeView_GetSelection(hArbre);
							DessFenetre(gblHDlg,hti);
							DessFenetre(gblHDlg,hti);
						}
						else	{
							sprintf(str,"notepad \"%s\"",elements[i].nom_fichier);
							WinExec(str,1);
						}
						break;
					case NM_RCLICK:
						GetCursorPos(&point);
						ScreenToClient(hArbre,&point);
						thti.pt.x=point.x;
						thti.pt.y=point.y;
						hti=TreeView_HitTest(hArbre,&thti);
						if (!hti)
							break;
//						TreeView_DeleteItem(hArbre,hti);
						GereBoutonDroit(hti);
						break;
				}
			}
			break;

		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 

			switch (HIWORD(wParam))		{
				case CBN_SELCHANGE:
					if ((HWND) lParam==hComboTiles)		{
						i=SendMessage(hComboTiles,CB_GETCURSEL,0,0);
						if (i==3)	{		//Case Personnalisé
							if (DialogBox(hInst,(LPCTSTR)IDD_TILES,hDlg,(DLGPROC)DlgTiles)==IDCANCEL)
								SendMessage(hComboTiles,CB_SETCURSEL,derI,0);
						}
						else
							derI=i;
					}
					else if ((HWND) lParam==hComboTileBits)		{
						i=SendMessage(hComboTileBits,CB_GETCURSEL,0,0);
						//Met le bon nombre de couleurs en fonction du mode
						if (i==0)
							SetWindowText(hTexte05,"15");
						else if (i==1)
							SetWindowText(hTexte05,"255");
						if (i==2)
							EnableWindow(hTexte05, FALSE);
						else
							EnableWindow(hTexte05, TRUE);
					}
					break;
				case BN_CLICKED:
					MajBoutons((HWND)lParam);
					break;
			}

			if (wmId>=BASEMENU && wmId<BASEMENU+nbreProcedures)		{
				GetMenuString(GetMenu(hDlg),wmId,str,sizeof(str),MF_BYCOMMAND);
				OuvreFichierConfig(fichierConfigAOuvrir,str);
				break;
			}

			//Analyse les sélections du menu
			switch (wmId)
			{
				case IDM_NOUVEAU:
					i=MessageBox(hDlg,"Enregistrer le projet d'abord?","Attention",MB_ICONINFORMATION|MB_YESNOCANCEL);
					if (i==IDCANCEL)
						break;
					if (i==IDYES)		{
						VerifFichierProjetExiste(str);
						if (!(*str))
							break;
						SauveProjet(str);
					}
					memset(elements,0,1000*sizeof(ELEMENT));
					nbreElements=0;
					fichierProjet[0]=0;
					MajListe(hDlg);
					break;
				case IDM_OUVRIR:
					i=MessageBox(hDlg,"Enregistrer le projet d'abord?","Attention",MB_ICONINFORMATION|MB_YESNOCANCEL);
					if (i==IDCANCEL)
						break;
					if (i==IDYES)		{
						VerifFichierProjetExiste(str);
						if (!(*str))
							break;
						SauveProjet(str);
					}
					memset(str,0,MAX_PATH);
					if (OuvreFichier(str,"\1Fichiers projet GBA Graphics *.pgg\0*.pgg\0\0"))		{
						ChargeProjet(str);
						FichierProjetActif(str);
						MajListe(hDlg);
					}
					break;

				case IDM_NETTOYER:
					if (MessageBox(hDlg, "Tous les éléments pointant vers un fichier qui n'existe plus seront supprimés.", "Nettoyage du projet", MB_ICONINFORMATION | MB_OKCANCEL) == IDOK)		{
						for (i=nbreElements-1;i>=0;i--)		{
							if (!(elements[i].type & TYPE_DOSSIER))			{
								if (!FichierExiste(elements[i].nom_fichier))
									EffaceElement(i);
							}
						}
					}
					break;

				case IDM_EXPORTERIMAGE:
					if (bImageTropGrosse)			{
						i = fMsgBox(hDlg, "Avertissement", MB_ICONEXCLAMATION|MB_OKCANCEL, "L'image ne peut pas être sauvegardée complètement car la mémoire allouée est insuffisante. Si vous voulez copier l'image entière, veuillez augmenter dans les options la mémoire disponible pour les aperçus (au moins %i Mo sont requis).", (bImageTropGrosse>>20)+1);
						if (i==IDCANCEL)
							break;
					}
					SauveBmpDisque();
					break;

				case IDM_COPIER:
					if (bImageTropGrosse)			{
						i = fMsgBox(hDlg, "Avertissement", MB_ICONEXCLAMATION|MB_OKCANCEL, "L'image ne peut pas être sauvegardée complètement car la mémoire allouée est insuffisante. Si vous voulez copier l'image entière, veuillez augmenter dans les options la mémoire disponible pour les aperçus (au moins %i Mo sont requis).", (bImageTropGrosse>>20)+1);
						if (i==IDCANCEL)
							break;
					}
					//A remplacer par les tailles max. du buffer
				//	i=tailleX>DIMENSION_MAX?DIMENSION_MAX:tailleX;
				//	j=tailleY>DIMENSION_MAX?DIMENSION_MAX:tailleY;
					i=LARG;
					j=HAUT;
					AnalyseImage(scrollX,scrollY,i,j,cFond,RGB(rougeMasque,vertMasque,bleuMasque));
					SauveBmpPressePapiers();
					AnalyseImage(scrollX,scrollY,i,j,RGB(rougeMasque,vertMasque,bleuMasque),cFond);
					break;

				case IDM_NOUVDOSS:
					DialogBox(hInst,(LPCTSTR)IDD_DOSSIER,hDlg,(DLGPROC)DlgNouvDoss);
					break;

				case IDM_SAUVER:
					VerifFichierProjetExiste(str);
					if (*str)		{
						FichierProjetActif(str);
						SauveProjet(str);
					}
					break;

				case IDM_SAUVERSOUS:
					DemandeSauveProjet(str);
					if (!(*str))
						break;
					FichierProjetActif(str);
					SauveProjet(str);
					break;
				case IDM_ACTUALISER:
					MajListe(hDlg);
					break;
				case IDM_ESCAPE:
					TreeView_EndEditLabelNow(hArbre,TRUE);
					break;
				case IDM_APROPOS:
//					MessageBox(hDlg,"GBA Graphics par Florian Brönnimann\nf_bron@hotmail.com, www.brunni.ch.vu\nCe programme peut être distribué librement, la source également. Cependant, si vous y aportez des améliorations, ce serait sympa de me les envoyer pour que tout le monde puisse en profiter.\nVous pouvez distribuer le programme modifié tant que vous n'enlevez pas mon nom et cette boîte doit rester intacte.\nAmusez-vous bien! ;)","A propos",MB_ICONINFORMATION);
					MessageBox(hDlg,"GBA Graphics version "
						GBA_GRAPHICS_VERSION
						" par Florian Brönnimann\nf_bron@hotmail.com, http://infernobox.dyndns.org/brunni/\nCe programme est gratuit pour une utilisation non commerciale seulement (dans le cas inverse, veuillez me contacter).\nAmusez-vous bien! ;)","A propos",MB_ICONINFORMATION);
//					MessageBox(hDlg,"GBA Graphics par Florian Brönnimann\nf_bron@hotmail.com, www.brunni.ch.vu\nCe programme est sous license GPL (OpenSource). Vous pouvez me faire part de vos impressions et/ou modifications du prog par e-mail.\nAmusez-vous bien! ;-)","A propos",MB_ICONINFORMATION);
					break;
				case IDM_AIDE:
					sprintf(str, "%s\\aide.htm", cInitialDir);
					ShellExecute(hDlg, NULL, str, NULL, NULL, SW_SHOWNORMAL);
					break;
				case IDM_AIDEPERSO:
					AidePerso();
					break;
				case IDM_COULEURS:
//					DialogBox(hInst,(LPCTSTR)IDD_COULEURS,hDlg,(DLGPROC)DlgCouleurs);
					DialogBox(hInst,(LPCTSTR)IDD_OPTIONSGENERALESONGLETS,hDlg,(DLGPROC)DlgOptionsGeneralesOnglets);
					break;
				case IDM_FORMAT:
					DialogBox(hInst,(LPCTSTR)IDD_FORMAT,hDlg,(DLGPROC)DlgFormats);
					break;

				case IDM_SHIFTTAB:
					//Gère la touche tabulation
					SendMessage(hDlg,WM_NEXTDLGCTL,TRUE,FALSE);
					break;
				case IDM_TAB:
					//Gère la touche tabulation
					SendMessage(hDlg,WM_NEXTDLGCTL,FALSE,FALSE);
					break;
				case IDM_QUITTER:
					if (editeurOuvert)
						break;
					OuvreFichierConfig(fichierConfigAOuvrir,"onquit");
					if (!retourScript)
						break;
					if (tooltip_nbreToolTips > 0)
						Debug("ERREUR HYPER GRAVE!!!!");
					tooltip_DestroyTooltip();
					EndDialog(hDlg,0);
					PostQuitMessage(0);
					break;
				case IDM_ENTREE:
					//Essaie de valider la zone de saisie. S'il ne peut pas (pas en train
					//d'éditer) on lance cela comme un appui du bouton Ok.
					if (TreeView_EndEditLabelNow(hArbre,FALSE))		{
						//Simuler l'appui sur le bouton Ok à n'importe quel moment avec la
						//touche Entrée.
						GereBoutonInconnu(hDlg, (HWND)hBoutonOk);
					}
					break;
				case IDM_EXECUTER:
					DialogBox(hInst,(LPCTSTR)IDD_EXECUTER,hDlg,(DLGPROC)DlgExec);
					break;

				default:
					//Un bouton non-enregistré nous a envoyé un message
					GereBoutonInconnu(hDlg, (HWND)lParam);
			}
			break;
		case WM_CLOSE:
			if (editeurOuvert)
				return TRUE;
			OuvreFichierConfig(fichierConfigAOuvrir,"onquit");
			if (!retourScript)
				break;
			VerifFichierProjetExiste(str);
			if (!(*str))
				break;
			SauveProjet(str);
			DestroyWindow(hDlg);
			Quitter=TRUE;
			PostQuitMessage(0);
			break;
	}
	return FALSE;
}

