| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 
 |  
#include <vector.h>
 
	//--------------------------------------------------------//
	//Le code 39 est expliquée en détails sur wikipédia : en.wikipedia.org/wiki/code_39
	//Selon ce site, un code a toujours 3 w (wide) et 6 n (narrow)
	//Toujours selon ce site, le ratio w/n peut être de 2/1 ou 3/1
	//C'est donc de dire que la largeur marximal est de w*3+n*6
	//Soit dans un ratio 2/1 : 2*3+1*6 = 12
	//Ou ratio 3/1 : 3*3 + 1*6 = 15
	//Dans ce cas-ci, un ratio de 2/1 sera utilisé dans la variable "ratio"
	//--------------------------------------------------------//
 
 
bool BarCode39Lettre(TRect RLettre, TCanvas *Canvas, AnsiString Lettre, int LargeurN, int ratio)
{
	/*
	Fonction secondaire servant à convertir une lettre en code 39 et écrit sur le Canvas à l'emplacement RLettre
	Les arguments sont les suivants :
	RLettre : Rectangle situé sur le canvas contenant une lettre en code 39
	Canvas : canvas sur lequel écrire le code bar
	Lettre : Lettre à écrire, si elle n'est pas parmis les lettres disponible du code 39, la fonction retourne false (ou 0)
	LargeurN : largeur d'une bande de type narrow (mince)
	Ratio : ratio entre les bandes larges(wide) et les bande minces (narrow) (typiquement 2:1, ou 3:1)
			pour un ratio de 2:1, le total de bande en unité est de 12
			pour un ratio de 3:1, le total unitaire est de 15
			Exemple 1 : Une lettre occupant 1.5cm de largeur avec un ratio de 3:1 aura une bande mince de 0.1cm de large et une large de 0.3cm
			Exemple 2 : Une lettre occupant 0.60cm de largeur et un ratio de 2:1 aura une bande unitaire (mince) de
	*/
 
	int Xmin; //Variable servant à déterminer le début de la barre
	int Xmax; //Variable servant à déterminer la fin de la barre
 
	unsigned int i = 0; //Varibale pour la boucle for
	unsigned int j = 0; //Varibale pour la boucle for
 
	bool found = false; //Booléen qui enregistre si le caractère a été trouvé ou non, sert pour le "return" de la fonction
 
	//********* Liste des Charactèrs valides pour le code 39  ***********//    (Mise à part le "*" qui sert de start and stop)
 
	vector<AnsiString> ListeChar; //Liste des caractères
	vector<string> ListeCharCode; //Liste des codes  "NarrowBlack/narrowWhite/WideBlack/WideWhite" pour les caractères
 
	//Liste des caractères        //Liste des codes correspondants
	ListeChar.clear();        	  ListeCharCode.clear();
 
	ListeChar.push_back("*");     ListeCharCode.push_back("NwNnWnWnN");
	ListeChar.push_back("-");     ListeCharCode.push_back("NwNnNnWnW");
	ListeChar.push_back("$");     ListeCharCode.push_back("NwNwNwNnN");
	ListeChar.push_back("%");     ListeCharCode.push_back("NnNwNwNwN");
	ListeChar.push_back(" ");     ListeCharCode.push_back("NwWnNnWnN");
	ListeChar.push_back(".");     ListeCharCode.push_back("WwNnNnWnN");
	ListeChar.push_back("/");     ListeCharCode.push_back("NwNwNnNwN");
	ListeChar.push_back("+");     ListeCharCode.push_back("NwNnNwNwN");
	ListeChar.push_back("0");     ListeCharCode.push_back("NnNwWnWnN");
	ListeChar.push_back("1");     ListeCharCode.push_back("WnNwNnNnW");
	ListeChar.push_back("2");     ListeCharCode.push_back("NnWwNnNnW");
	ListeChar.push_back("3");     ListeCharCode.push_back("WnWwNnNnN");
	ListeChar.push_back("4");     ListeCharCode.push_back("NnNwWnNnW");
	ListeChar.push_back("5");     ListeCharCode.push_back("WnNwWnNnN");
	ListeChar.push_back("6");     ListeCharCode.push_back("NnWwWnNnN");
	ListeChar.push_back("7");     ListeCharCode.push_back("NnNwNnWnW");
	ListeChar.push_back("8");     ListeCharCode.push_back("WnNwNnWnN");
	ListeChar.push_back("9");     ListeCharCode.push_back("NnWwNnWnN");
	ListeChar.push_back("A");     ListeCharCode.push_back("WnNnNwNnW");
	ListeChar.push_back("B");     ListeCharCode.push_back("NnWnNwNnW");
	ListeChar.push_back("C");     ListeCharCode.push_back("WnWnNwNnN");
	ListeChar.push_back("D");     ListeCharCode.push_back("NnNnWwNnW");
	ListeChar.push_back("E");     ListeCharCode.push_back("WnNnWwNnN");
	ListeChar.push_back("F");     ListeCharCode.push_back("NnWnWwNnN");
	ListeChar.push_back("G");     ListeCharCode.push_back("NnNnNwWnW");
	ListeChar.push_back("H");     ListeCharCode.push_back("WnNnNwWnN");
	ListeChar.push_back("I");     ListeCharCode.push_back("NnWnNwWnN");
	ListeChar.push_back("J");     ListeCharCode.push_back("NnNnWwWnN");
	ListeChar.push_back("K");     ListeCharCode.push_back("WnNnNnNwW");
	ListeChar.push_back("L");     ListeCharCode.push_back("NnWnNnNwW");
	ListeChar.push_back("M");     ListeCharCode.push_back("WnWnNnNwN");
	ListeChar.push_back("N");     ListeCharCode.push_back("NnNnWnNwW");
	ListeChar.push_back("O");     ListeCharCode.push_back("WnNnWnNwN");
	ListeChar.push_back("P");     ListeCharCode.push_back("NnWnWnNwN");
	ListeChar.push_back("Q");     ListeCharCode.push_back("NnNnNnWwW");
	ListeChar.push_back("R");     ListeCharCode.push_back("WnNnNnWwN");
	ListeChar.push_back("S");     ListeCharCode.push_back("NnWnNnWwN");
	ListeChar.push_back("T");     ListeCharCode.push_back("NnNnWnWwN");
	ListeChar.push_back("U");     ListeCharCode.push_back("WwNnNnNnW");
	ListeChar.push_back("V");     ListeCharCode.push_back("NwWnNnNnW");
	ListeChar.push_back("W");     ListeCharCode.push_back("WwWnNnNnN");
	ListeChar.push_back("X");     ListeCharCode.push_back("NwNnWnNnW");
	ListeChar.push_back("Y");     ListeCharCode.push_back("WwNnWnNnN");
	ListeChar.push_back("Z");     ListeCharCode.push_back("NwWnWnNnN");
 
	//***********************************************************************//
 
	Xmin = RLettre.left; //Initialisation du Xmin à gauche
 
	Canvas->Brush->Color = clBlack; //Pinceau en noir
 
	i = 0;
 
	//Tant que la lettre n'a pas été trouvé et que la fin de la liste de caractères n'est pas atteint
	while(found == false && i<ListeChar.size())
	{
		//Si le caractère est trouvé
		if(ListeChar[i].UpperCase() == Lettre.UpperCase())
		{
			//Pour les 9 codes (exemple : NwWnWnNnN pour la lettre Z)
			for(j=0;j<9;j++)
			{
				//Si c'est un narrow white
				if(AnsiString(ListeCharCode[i][j]) == "n")
				{
					//On laisse l'espace blanc, donc on se tasse de LargeurN
					Xmin += LargeurN;
				}
				//Si c'est un narrow Black
				if(AnsiString(ListeCharCode[i][j]) == "N")
				{
					//On dessine un carré noir(couleur du brush) de LargeurN (définit par un carré Xmin, Xmin + LargeurN)
					Canvas->FillRect(Rect(Xmin,RLettre.top,Xmin + LargeurN,RLettre.bottom));
					Xmin += LargeurN;
				}
				if(AnsiString(ListeCharCode[i][j]) == "w")
				{
					//On laisse l'espace blanc, donc on se tasse de LargeurN multiplié par ratio
					Xmin += LargeurN*ratio;
				}
				if(AnsiString(ListeCharCode[i][j]) == "W")
				{
					//On dessine un carré noir(couleur du brush) de LargeurN multiplié par le ratio (définit par un carré Xmin, Xmin + LargeurN*ratio)
					Canvas->FillRect(Rect(Xmin,RLettre.top,Xmin + LargeurN*ratio,RLettre.bottom));
					Xmin += LargeurN*ratio;
				}
			}
			//booléen changé pour vrai
			found = true;
		}
		//Si le caractère n'est pas le i ième, incrémenter
		else
		{
			i++;
        }
	}
	//Remise à blanc la couleur du pinceau (sinon le texte écrit sur le canvas aura un fond noir)
	Canvas->Brush->Color = clWhite;
 
	//Retourne si la lettre a été trouvée
	return found;
};
 
 
void BarCode39(TRect RectCodeBarre, TCanvas *Canvas, string Text)
{
	/*
	Fonction principale calculant la largeur requise pour chacun des caractère en fonction de la largeur du rectangle
	Ensuite elle écrit sur le canvas vis-à-vis le rectangle le text souhaité grâce à la fonction  "BarCode39Lettre"
	Les arguments sont les suivants :
	RectCodeBarre : Rectangle dans lequel on veut le code à barre
	Canvas : Canvas dans lequel on veut dessiner (écrire) le code à barre
	Text : le text à écrire
	*/
	int ratio = 2;	//Ratio W/N
 
	int LentghText = Text.length();  //Longueur du text, variable servant à calculer la largeur en pixel de chacun des barres
 
	int LargeurN;   //Narrow Black
	int Largeurn;   //narrow White
	int LargeurW;   //Wide Black
	int Largeurw;   //wide White
	int LargeurChar; //Largeur d'un caractère
 
	int Xmin;   //Variable servant à déterminer le début du caractère lors de l'écriture sur le Canvas
	int Xmax;   //Variable servant à déterminer la fin du caractère lors de l'écriture sur le Canvas
 
	unsigned int i = 0;  //Variable pour la boucle For
 
 
	//********* Répartition égale des caractères dans le rectangle ***************//
 
		LargeurChar = RectCodeBarre.Width()/(LentghText + 2); // + 2 pour les "start and stop" caractères "*"
 
		//--Narrow--//
		LargeurN = LargeurChar/(ratio*3+6); //Largeur d'une barre "narrow"
		Largeurn = LargeurN; //Largeur narrow white = narrow black
 
		//--Wide--//
		LargeurW = Largeurn*ratio; //Largeur wide black = narrow black * ratio
		Largeurw = LargeurW; //Largeur wide white = wide black
 
	//****************************************************************************//
 
	//*** Start character "*"  *****//
 
		Xmin = RectCodeBarre.left; //Initialisation des variables Xmin et Xmax
		Xmax = Xmin + LargeurChar; //Initialisation des variables Xmin et Xmax
 
		BarCode39Lettre(Rect(Xmin,RectCodeBarre.top,Xmax,RectCodeBarre.bottom),Canvas,"*", LargeurN, ratio);
 
	//*****************************//
 
 
	//*** Boucle for sur chacun des caractères du text à imprimer  ****//
 
		Xmin += LargeurChar;    //Incrément de la largeur de 1 caractère
		Xmax += LargeurChar;    //Incrément de la largeur de 1 caractère
 
		for (i = 0;i<LentghText;i++)
		{
			if(BarCode39Lettre(Rect(Xmin,RectCodeBarre.top,Xmax,RectCodeBarre.bottom),Canvas,Text[i], LargeurN, ratio) == true) //Si c'est un caractère imprimable en code 39
			{
				Xmin += LargeurChar;
				Xmax += LargeurChar;
			}
		}
 
	//***************************************************************//
 
	//***** Stop character "*"  *****//
		BarCode39Lettre(Rect(Xmin,RectCodeBarre.top,Xmax,RectCodeBarre.bottom),Canvas,"*", LargeurN, ratio);
	//*******************************//
 
}; | 
Partager