barcode.h

来自「VC++开源条形码代码。自动生成条形码和打印功能」· C头文件 代码 · 共 1,349 行 · 第 1/2 页

H
1,349
字号
			{51,3,	-1},
			{52,4,	-1},
			{53,5,	-1},
			{54,6,	-1},
			{55,7,	-1},
			{56,8,	-1},
			{57,9,	-1},
			{58,45,	35},
			{59,44,	15},
			{60,44,	16},
			{61,44,	17},
			{62,44,	18},
			{63,44,	19},
			{64,44,	31},
			{65,10,	-1},
			{66,11,	-1},
			{67,12,	-1},
			{68,13,	-1},
			{69,14,	-1},
			{70,15,	-1},
			{71,16,	-1},
			{72,17,	-1},
			{73,18,	-1},
			{74,19,	-1},
			{75,20,	-1},
			{76,21,	-1},
			{77,22,	-1},
			{78,23,	-1},
			{79,24,	-1},
			{80,25,	-1},
			{81,26,	-1},
			{82,27,	-1},
			{83,28,	-1},
			{84,29,	-1},
			{85,30,	-1},
			{86,31,	-1},
			{87,32,	-1},
			{88,33,	-1},
			{89,34,	-1},
			{90,35,	-1},
			{91,44,	20},
			{92,44,	21},
			{93,44,	22},
			{94,44,	23},
			{95,44,	24},
			{96,44,	32},
			{97,46,	10},
			{98,46,	11},
			{99,46,	12},
			{100,46,13},
			{101,46,14},
			{102,46,15},
			{103,46,16},
			{104,46,17},
			{105,46,18},
			{106,46,19},
			{107,46,20},
			{108,46,21},
			{109,46,22},
			{110,46,23},
			{111,46,24},
			{112,46,25},
			{113,46,26},
			{114,46,27},
			{115,46,28},
			{116,46,29},
			{117,46,30},
			{118,46,31},
			{119,46,32},
			{120,46,33},
			{121,46,34},
			{122,46,35},
			{123,44,25},
			{124,44,26},
			{125,44,27},
			{126,44,28},
			{127,44,29},
		};

		I3&i3=i3s[iValue];
		iFirst	=i3.iFirst;
		iSecond	=i3.iSecond;
		return 1;
	}
};


class Barcode128:public BarcodeBase
{
public:
	Barcode128()
	{
	}
	~Barcode128()
	{
	}

	BOOL Encode128A(const char* pszCode)	{return P_Encode128((char*)pszCode,SUB::SETA);}
	BOOL Encode128B(const char* pszCode)	{return P_Encode128((char*)pszCode,SUB::SETB);}
	BOOL Encode128C(const char* pszCode)	{return P_Encode128((char*)pszCode,SUB::SETC);}

	void Draw128(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
	{
		DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
	}

private:
	struct SUB
	{
		enum
		{
			SETA=0,
			SETB=1,
			SETC=2,
		};
	};

	BOOL P_Encode128(char*pszCode,const int iSetIn)
	{
		Clear();
		BYTE*pFst=ia_Buf;
		BYTE*pb=pFst;


		if(iSetIn==SUB::SETA)	pb=P_GetBarSpace128(pb,103);
		else
		if(iSetIn==SUB::SETB)	pb=P_GetBarSpace128(pb,104);
		else					pb=P_GetBarSpace128(pb,105);
		if(pb==0)	return 0;

		const int iCheckDigit=GetCheckDigit(iSetIn,pszCode);
		const int iNum=strlen(pszCode);

		int iChar,iCharNext;
		int iPosition=0;
		int iSet=iSetIn;

		while(iPosition<iNum)
		{
			if(iSet==SUB::SETC)
			{
				if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
				{
					pb=P_GetBarSpace128(pb,101);
					iPosition++;
					iSet=SUB::SETA;
				}
				else 
				if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
				{
					pb=P_GetBarSpace128(pb,100);
					iPosition++;
					iSet=SUB::SETB;
				}
				else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
				{
					pb=P_GetBarSpace128(pb,100);
					iPosition++;
				}
				else
				{
					char chT=pszCode[iPosition+2];
					pszCode[iPosition+2]=0;
					iChar=atoi(&pszCode[iPosition]);
					pszCode[iPosition+2]=chT;

					pb=P_GetBarSpace128(pb,iChar);
					if(pb==0)	return 0;
					iPosition +=2;
				}
			}
			else
			{
				int iTemp2=pszCode[iPosition];
				if(iTemp2<-1)	iTemp2=iTemp2&255;
				
				iChar=ga2_Code128[iSet][iTemp2];
				
				pb=P_GetBarSpace128(pb,iChar);
				if(pb==0)	return 0;
				iPosition++;
				if(iSet==SUB::SETA)
				{
					if(iChar==100)	iSet=SUB::SETB;
					else 
					if(iChar==99)	iSet=SUB::SETC;
				}
				else if(iSet==SUB::SETB)
				{
					if(iChar==101)	iSet=SUB::SETA;
					else 
					if(iChar==99)	iSet=SUB::SETC;
				}
				else 
				if(iChar==98)
				{
					if(iSet==SUB::SETA)
						iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
					else
						iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];

					pb=P_GetBarSpace128(pb,iChar);
					if(pb==0)	return 0;
					iPosition++;
				}
			}
		}

		pb=P_GetBarSpace128(pb,iCheckDigit);
		if(pb==0)	return 0;
		pb=P_GetBarSpace128(pb,106);
		i_LenBuf=pb-pFst;

		return 1;
	}

	BYTE*P_GetBarSpace128(BYTE*pb,int iV)
	{
		if(iV<0)	return 0;
		if(iV>106)	return 0;
		IntString infs[]=
		{
			{0,		"bbsbbssbbss"},
			{1,		"bbssbbsbbss"},
			{2,		"bbssbbssbbs"},
			{3,		"bssbssbbsss"},
			{4,		"bssbsssbbss"},
			{5,		"bsssbssbbss"},
			{6,		"bssbbssbsss"},
			{7,		"bssbbsssbss"},
			{8,		"bsssbbssbss"},
			{9,		"bbssbssbsss"},
			{10,	"bbssbsssbss"},
			{11,	"bbsssbssbss"},
			{12,	"bsbbssbbbss"},
			{13,	"bssbbsbbbss"},
			{14,	"bssbbssbbbs"},
			{15,	"bsbbbssbbss"},
			{16,	"bssbbbsbbss"},
			{17,	"bssbbbssbbs"},
			{18,	"bbssbbbssbs"},
			{19,	"bbssbsbbbss"},
			{20,	"bbssbssbbbs"},
			{21,	"bbsbbbssbss"},
			{22,	"bbssbbbsbss"},
			{23,	"bbbsbbsbbbs"},
			{24,	"bbbsbssbbss"},
			{25,	"bbbssbsbbss"},
			{26,	"bbbssbssbbs"},
			{27,	"bbbsbbssbss"},
			{28,	"bbbssbbsbss"},
			{29,	"bbbssbbssbs"},
			{30,	"bbsbbsbbsss"},
			{31,	"bbsbbsssbbs"},
			{32,	"bbsssbbsbbs"},
			{33,	"bsbsssbbsss"},
			{34,	"bsssbsbbsss"},
			{35,	"bsssbsssbbs"},
			{36,	"bsbbsssbsss"},
			{37,	"bsssbbsbsss"},
			{38,	"bsssbbsssbs"},
			{39,	"bbsbsssbsss"},
			{40,	"bbsssbsbsss"},
			{41,	"bbsssbsssbs"},
			{42,	"bsbbsbbbsss"},
			{43,	"bsbbsssbbbs"},
			{44,	"bsssbbsbbbs"},
			{45,	"bsbbbsbbsss"},
			{46,	"bsbbbsssbbs"},
			{47,	"bsssbbbsbbs"},
			{48,	"bbbsbbbsbbs"},
			{49,	"bbsbsssbbbs"},
			{50,	"bbsssbsbbbs"},
			{51,	"bbsbbbsbsss"},
			{52,	"bbsbbbsssbs"},
			{53,	"bbsbbbsbbbs"},
			{54,	"bbbsbsbbsss"},
			{55,	"bbbsbsssbbs"},
			{56,	"bbbsssbsbbs"},
			{57,	"bbbsbbsbsss"},
			{58,	"bbbsbbsssbs"},
			{59,	"bbbsssbbsbs"},
			{60,	"bbbsbbbbsbs"},
			{61,	"bbssbssssbs"},
			{62,	"bbbbsssbsbs"},
			{63,	"bsbssbbssss"},
			{64,	"bsbssssbbss"},
			{65,	"bssbsbbssss"},
			{66,	"bssbssssbbs"},
			{67,	"bssssbsbbss"},
			{68,	"bssssbssbbs"},
			{69,	"bsbbssbssss"},
			{70,	"bsbbssssbss"},
			{71,	"bssbbsbssss"},
			{72,	"bssbbssssbs"},
			{73,	"bssssbbsbss"},
			{74,	"bssssbbssbs"},
			{75,	"bbssssbssbs"},
			{76,	"bbssbsbssss"},
			{77,	"bbbbsbbbsbs"},
			{78,	"bbssssbsbss"},
			{79,	"bsssbbbbsbs"},
			{80,	"bsbssbbbbss"},
			{81,	"bssbsbbbbss"},
			{82,	"bssbssbbbbs"},
			{83,	"bsbbbbssbss"},
			{84,	"bssbbbbsbss"},
			{85,	"bssbbbbssbs"},
			{86,	"bbbbsbssbss"},
			{87,	"bbbbssbsbss"},
			{88,	"bbbbssbssbs"},
			{89,	"bbsbbsbbbbs"},
			{90,	"bbsbbbbsbbs"},
			{91,	"bbbbsbbsbbs"},
			{92,	"bsbsbbbbsss"},
			{93,	"bsbsssbbbbs"},
			{94,	"bsssbsbbbbs"},
			{95,	"bsbbbbsbsss"},
			{96,	"bsbbbbsssbs"},
			{97,	"bbbbsbsbsss"},
			{98,	"bbbbsbsssbs"},
			{99,	"bsbbbsbbbbs"},
			{100,	"bsbbbbsbbbs"},
			{101,	"bbbsbsbbbbs"},
			{102,	"bbbbsbsbbbs"},
//			{103,	"bbsbsbbbbss"},
			{103,	"bbsbssssbss"},
			{104,	"bbsbssbssss"},
			{105,	"bbsbssbbbss"},
			{106,	"bbsssbbbsbsbb"},
		};	
		
		int i;
		IntString&inf=infs[iV];
		for(i=0;i<11;i++)
		{
			if(inf.psz[i]=='b')	*pb+=1;
			pb++;
		}
		if(iV==106)	
		{
			*pb+=1;	pb++;
			*pb+=1;	pb++;
		}
		return pb;
	}

private:
	int GetCheckDigit(const int iSet,char*pszCode)
	{
		int	iSum=0,iCurSet=0,iChar128,iCharNext,iWeight,iPosition;

		iCurSet=iSet;
		if(iSet==SUB::SETA)
		{
			iSum=103;
		}
		else 
		if(iSet==SUB::SETB)
		{
			iSum=104;
		}
		else 
		if(iSet==SUB::SETC)
		{
			iSum=105;
		}

		iPosition=0;
		iWeight=1;

		const int iNum=strlen(pszCode);
		while(iPosition<iNum)
		{
			if(iCurSet==SUB::SETC)
			{
				if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
				{
					iChar128=101;
					iSum+=(iWeight*iChar128);
					
					iPosition++;
					iWeight++;
					iCurSet=SUB::SETA;
				}
				else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
				{
					iChar128=100;
					iSum+=(iWeight*iChar128);
					iPosition++;
					iWeight++;
					iCurSet=SUB::SETB;
				}
				else 
				if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
				{
					iChar128=102;
					iSum+=(iWeight*iChar128);
					iPosition++;
					iWeight++;
				}
				else
				{
					char chT=pszCode[iPosition+2];
					pszCode[iPosition+2]=0;
					iChar128=atol(&pszCode[iPosition]);
					pszCode[iPosition+2]=chT;

					iSum +=(iWeight*iChar128);
					iPosition +=2;
					iWeight++;
				}
			}
			else 
			{
				int iTemp2=pszCode[iPosition];
				if(iTemp2<-1)	iTemp2=iTemp2&255;
				
				iChar128=ga2_Code128[iCurSet][iTemp2];

				iSum+=(iWeight*iChar128);

				iPosition++;
				iWeight++;

				if(iCurSet==SUB::SETA)
				{
					if(iChar128==100)
						iCurSet=SUB::SETB;
					else if(iChar128==99)
						iCurSet=SUB::SETC;
				}
				else 
				if(iCurSet==SUB::SETB)
				{
					if(iChar128==101)		iCurSet=SUB::SETA;
					else if(iChar128==99)	iCurSet=SUB::SETC;
				}
				else 
				if(iChar128==98)
				{
					if(iCurSet==SUB::SETA)
						iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
					else
						iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];

					iSum+=(iWeight*iCharNext);
					iPosition++;
					iWeight++;
				}
			}
		}
		return iSum%103;
	}
};

//=============================================
class BarcodeEan13:public BarcodeBase
{
public:
	BarcodeEan13()
	{
	}
	~BarcodeEan13()
	{
	}

	BOOL EncodeEan13(const char*pszCodeIn)
	{
		Clear();
		
		//only allow 12 characters as input
		char szCode[14];
		const int iLen=strlen(pszCodeIn);
		if(iLen>12)
		{
			strncpy(szCode,pszCodeIn,12);
		}
		else
		{
			strcpy(szCode,pszCodeIn);
			while(strlen(szCode)<12)	strcat(szCode,"0");
		}

		BYTE*pFst=ia_Buf;
		BYTE*pb=pFst;

		//"bsb"-long
		*pb+=5;	pb++;
		*pb+=4;	pb++;
		*pb+=5;	pb++;

		BYTE iaCountryCode[6];
		BOOL b=P_GetCountryCode(szCode[0],iaCountryCode);
		if(b==0)	return 0;

		pb=P_GetLeftOddParity(pb,szCode[1]);
		
		int i;
		for(i=2;i<7;i++)
		{
			if(iaCountryCode[i-2]=='O')
			{
				pb=P_GetLeftOddParity(pb,szCode[i]);
			}
			else
			if(iaCountryCode[i-2]=='E')
			{
				pb=P_GetLeftEvenParity(pb,szCode[i]);
			}
		}

		//"sbsbs"-long
		*pb+=4;	pb++;
		*pb+=5;	pb++;
		*pb+=4;	pb++;
		*pb+=5;	pb++;
		*pb+=4;	pb++;

		for(i=7;i<12;i++)
		{
			pb=P_GetRightPattern(pb,szCode[i]);
		}

		i=P_GetCheckSumDigit(szCode);
		pb=P_GetRightPattern(pb,(char)i);

		//"bsb"-long
		*pb+=5;	pb++;
		*pb+=4;	pb++;
		*pb+=5;	pb++;

		i_LenBuf=pb-pFst;
		return 1;
	}

	void DrawEan13(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
	{
		DrawBarcode(hDC,iX,iY0,iY10,iY11,clrBar,clrSpace,iPenW);
	}

private:
	BOOL P_GetCountryCode(char ch,BYTE*pbCountryCode)
	{
		const int iV=ch-'0';
		if(iV<0)	return 0;
		if(iV>9)	return 0;

		IntString infs[]=
		{
			{0,	"OOOOO"},
			{1,	"OEOEE"},
			{2,	"OEEOE"},
			{3,	"OEEEO"},
			{4,	"EOOEE"},
			{5,	"EEOOE"},
			{6,	"EEEOO"},
			{7,	"EOEOE"},
			{8,	"EOEEO"},
			{9,	"EEOEO"},
		};
		memcpy(pbCountryCode,infs[iV].psz,5);
		return 1;
	}

	BYTE*P_GetLeftOddParity(BYTE*pb,char ch)
	{
		const int iV=ch-'0';
		if(iV<0)	return 0;
		if(iV>9)	return 0;


		IntString infs[]=
		{
			{0,	"sssbbsb"},
			{1,	"ssbbssb"},
			{2,	"ssbssbb"},
			{3,	"sbbbbsb"},
			{4,	"sbsssbb"},
			{5,	"sbbsssb"},
			{6,	"sbsbbbb"},
			{7,	"sbbbsbb"},
			{8,	"sbbsbbb"},
			{9,	"sssbsbb"},
		};

		IntString&inf=infs[iV];
		int i;
		for(i=0;i<7;i++)
		{
			if(inf.psz[i]=='b')	*pb+=1;
			pb++;
		}
		return pb;
	}

	BYTE*P_GetLeftEvenParity(BYTE*pb,char ch)
	{
		const int iV=ch-'0';
		if(iV<0)	return 0;
		if(iV>9)	return 0;

		IntString infs[]=
		{
			{0,	"sbssbbb"},
			{1,	"sbbssbb"},
			{2,	"ssbbsbb"},
			{3,	"sbssssb"},
			{4,	"ssbbbsb"},
			{5,	"sbbbssb"},
			{6,	"ssssbsb"},
			{7,	"ssbsssb"},
			{8,	"sssbssb"},
			{9,	"ssbsbbb"},
		};
		char*psz=infs[iV].psz;
		int i;
		for(i=0;i<7;i++)
		{
			if(psz[i]=='b')	*pb+=1;
			pb++;
		}
		return pb;
	}

	BYTE*P_GetRightPattern(BYTE*pb,char ch)
	{
		const int iV=ch-'0';
		if(iV<0)	return 0;
		if(iV>9)	return 0;

		IntString infs[]=
		{
			{0,	"bbbssbs"},
			{1,	"bbssbbs"},
			{2,	"bbsbbss"},
			{3,	"bssssbs"},
			{4,	"bsbbbss"},
			{5,	"bssbbbs"},
			{6,	"bsbssss"},
			{7,	"bsssbss"},
			{8,	"bssbsss"},
			{9,	"bbbsbss"},
		};
		char*psz=infs[iV].psz;
		int i;
		for(i=0;i<7;i++)
		{
			if(psz[i]=='b')	*pb+=1;
			pb++;
		}
		return pb;
	}

	char P_GetCheckSumDigit(const char*pszCode)
	{
		const int iLen=strlen(pszCode);
		int i,iSum=0,iItem;

		for(i=iLen;i >=1;i--)
		{
			iItem=i%2?(pszCode[i-1]-'0')*1:(pszCode[i-1]-'0')*3;
			iSum+=iItem;
		}

		iSum%=10;
		return '0'+(10-iSum)%10;
	}

};


#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?