⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barcode.h

📁 VC++开源条形码代码。自动生成条形码和打印功能
💻 H
📖 第 1 页 / 共 2 页
字号:


#ifndef Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue
#define Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue


class Barcode39;
class Barcode93;
class BarcodeIof5;
class Barcode128;

const int ga2_Code128[2][207]=
{
	{
		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,
		0,   1,   2,   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,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
	},
	{
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		0,   1,   2,   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,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
		-1,  -1,  -1,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
	},
};


class BarcodeBase
{
public:
	BarcodeBase()
	{
		Clear();
		i_Ratio=3;
	}

	void operator=(const BarcodeBase&bc)
	{
		i_LenBuf=bc.i_LenBuf;
		i_Ratio	=bc.i_Ratio;
		memcpy(ia_Buf,bc.ia_Buf,sizeof(ia_Buf));
	}

	void Clear()
	{
		memset(ia_Buf,0,sizeof(ia_Buf));
		i_LenBuf=0;
	}

	int GetEncodeLength()	const
	{
		BYTE*pb=(BYTE*)ia_Buf;
		int i,iLen=0;
		for(i=0;i<i_LenBuf;i++)
		{
			//wide is 3
			if(*pb&2)	iLen+=(i_Ratio-1);
			pb++;
		}
		return iLen+i_LenBuf;
	}
	int GetBufferLength()	const
	{
		return i_LenBuf;
	}
	const BYTE&GetAt(int i)	const 
	{
		return ia_Buf[i];
	}
	int GetRatio()	const
	{
		return i_Ratio;
	}
	int SetRatio(int iRatio)
	{
		i_Ratio=iRatio;
		if(i_Ratio<=0)	i_Ratio=1;
	}
	void DrawBarcode(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
	{
		HPEN hPenBar	=::CreatePen(PS_SOLID,iPenW,clrBar);
		HPEN hPenSpace	=::CreatePen(PS_SOLID,iPenW,clrSpace);

		HPEN hPenOld=(HPEN)::SelectObject(hDC,hPenBar);

		BYTE*pb=ia_Buf;
		int i0,iNum0=i_LenBuf;
		
		BYTE bBar;
		int i1,iNum1;
		int iY;
		for(i0=0;i0<iNum0;i0++)
		{
			bBar	=*pb&0x01;
			iNum1	=(*pb&0x02)?i_Ratio:1;
			iY		=(*pb&0x04)?iY11:iY10;
			for(i1=0;i1<iNum1;i1++)
			{
				if(bBar)	::SelectObject(hDC,hPenBar);
				else		::SelectObject(hDC,hPenSpace);
				
				::MoveToEx(hDC,iX,iY0,0);
				::LineTo(hDC,iX,iY);
				iX+=iPenW;
			}
			pb++;
		}

		::SelectObject(hDC,hPenOld);

		::DeleteObject(hPenBar);
		::DeleteObject(hPenSpace);
	}

protected:
	BYTE	ia_Buf[4096];
	int		i_LenBuf;

	int		i_Ratio;

	struct IntString
	{
		int ch;
		char*psz;
	};

};

class Barcode39:public BarcodeBase
{
	//[n/a][n/a][n/a][n/a][n/a][n/a][w-n][b-s]
public:
	Barcode39()
	{
	}
	~Barcode39()
	{
	}

	BOOL Encode39(const char*pszCodeIn)
	{
		int iLen=strlen(pszCodeIn);

		char*pszCode=new char[iLen+3];
		sprintf(pszCode,"*%s*",pszCodeIn);
		strupr(pszCode);

		BYTE*pFst=ia_Buf;
		BYTE*p0=pFst,*p1;

		iLen+=2;
		int i;
		for(i=0;i<iLen;i++)
		{
			p1=P_GetNarrowWideBarSpace39(pszCode[i],p0);
			if(p1==0)	return 0;
			p0=p1;
		}
		i_LenBuf=p1-pFst;
		delete []pszCode;
		return 1;
	}

	void Draw39(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:
	BYTE*P_GetNarrowWideBarSpace39(char ch,BYTE*pb)
	{
		IntString infs[]=
		{
			{'1',	"wnnwnnnnwn"},
			{'2',	"nnwwnnnnwn"},
			{'3',	"wnwwnnnnnn"},
			{'4',	"nnnwwnnnwn"},
			{'5',	"wnnwwnnnnn"},
			{'6',	"nnwwwnnnnn"},
			{'7',	"nnnwnnwnwn"},
			{'8',	"wnnwnnwnnn"},
			{'9',	"nnwwnnwnnn"},
			{'0',	"nnnwwnwnnn"},
			{'A',	"wnnnnwnnwn"},
			{'B',	"nnwnnwnnwn"},
			{'C',	"wnwnnwnnnn"},
			{'D',	"nnnnwwnnwn"},
			{'E',	"wnnnwwnnnn"},
			{'F',	"nnwnwwnnnn"},
			{'G',	"nnnnnwwnwn"},
			{'H',	"wnnnnwwnnn"},
			{'I',	"nnwnnwwnnn"},
			{'J',	"nnnnwwwnnn"},
			{'K',	"wnnnnnnwwn"},
			{'L',	"nnwnnnnwwn"},
			{'M',	"wnwnnnnwnn"},
			{'N',	"nnnnwnnwwn"},
			{'O',	"wnnnwnnwnn"},
			{'P',	"nnwnwnnwnn"},
			{'Q',	"nnnnnnwwwn"},
			{'R',	"wnnnnnwwnn"},
			{'S',	"nnwnnnwwnn"},
			{'T',	"nnnnwnwwnn"},
			{'U',	"wwnnnnnnwn"},
			{'V',	"nwwnnnnnwn"},
			{'W',	"wwwnnnnnnn"},
			{'X',	"nwnnwnnnwn"},
			{'Y',	"wwnnwnnnnn"},
			{'Z',	"nwwnwnnnnn"},
			{'-',	"nwnnnnwnwn"},
			{'.',	"wwnnnnwnnn"},
			{' ',	"nwwnnnwnnn"},
			{'*',	"nwnnwnwnnn"},
			{'$',	"nwnwnwnnnn"},
			{'/',	"nwnwnnnwnn"},
			{'+',	"nwnnnwnwnn"},
			{'%',	"nnnwnwnwnn"},
		};
		
		int i0,iNum0=sizeof(infs)/sizeof(infs[0]);
		int i1;
		for(i0=0;i0<iNum0;i0++)
		{
			IntString&inf=infs[i0];
			if(inf.ch==ch)
			{
				for(i1=0;i1<10;i1++)
				{
					if(inf.psz[i1]=='w')	*pb+=2;
					if(i1%2==0)			*pb+=1;
					pb++;
				}
				return pb;
			}
		}
		return 0;
	}
};

class BarcodeI2of5:public BarcodeBase
{
	//[n/a][n/a][n/a][n/a][n/a][n/a][w-n][b-s]
public:
	BarcodeI2of5()
	{
	}
	~BarcodeI2of5()
	{
	}

	BOOL EncodeI2of5(const char*pszCode)
	{
		Clear();
		BYTE*pFst=ia_Buf;
		BYTE*pb=pFst;

		const int iNum=strlen(pszCode);
		
		int i;
		//"nnnn"
		for(i=0;i<4;i++)
		{
			if(i%2==0)	*pb+=1;
			pb++;
		}

		int iV;
		for(i=0;i<iNum;i+=2)
		{
			iV=pszCode[i]-'0';
			iV=iV*10;
			iV+=pszCode[i+1]-'0';
			pb=P_GetNarrorWideBarSpaceI2of5(pb,iV);
			if(pb==0)	return 0;
		}

		//"wnn"
		*pb+=3;	pb++;
		*pb+=0;	pb++;
		*pb+=1;	pb++;

		i_LenBuf=pb-pFst;
		return 1;
	}

	void DrawI2of5(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:
	BYTE*P_GetNarrorWideBarSpaceI2of5(BYTE*pb,int ch)
	{
		if(ch<0)	return 0;
		if(ch>99)	return 0;

		IntString infs[]=
		{
			{0,		"nnnnwwwwnn"},
			{1,		"nwnnwnwnnw"},
			{2,		"nnnwwnwnnw"},
			{3,		"nwnwwnwnnn"},
			{4,		"nnnnwwwnnw"},
			{5,		"nwnnwwwnnn"},
			{6,		"nnnwwwwnnn"},
			{7,		"nnnnwnwwnw"},
			{8,		"nwnnwnwwnn"},
			{9,		"nnnwwnwwnn"},
			{10,	"wnnnnwnwwn"},
			{11,	"wwnnnnnnww"},
			{12,	"wnnwnnnnww"},
			{13,	"wwnwnnnnwn"},
			{14,	"wnnnnwnnww"},
			{15,	"wwnnnwnnwn"},
			{16,	"wnnwnwnnwn"},
			{17,	"wnnnnnnwww"},
			{18,	"wwnnnnnwwn"},
			{19,	"wnnwnnnwwn"},
			{20,	"nnwnnwnwwn"},
			{21,	"nwwnnnnnww"},
			{22,	"nnwwnnnnww"},
			{23,	"nwwwnnnnwn"},
			{24,	"nnwnnwnnww"},
			{25,	"nwwnnwnnwn"},
			{26,	"nnwwnwnnwn"},
			{27,	"nnwnnnnwww"},
			{28,	"nwwnnnnwwn"},
			{29,	"nnwwnnnwwn"},
			{30,	"wnwnnwnwnn"},
			{31,	"wwwnnnnnnw"},
			{32,	"wnwwnnnnnw"},
			{33,	"wwwwnnnnnn"},
			{34,	"wnwnnwnnnw"},
			{35,	"wwwnnwnnnn"},
			{36,	"wnwwnwnnnn"},
			{37,	"wnwnnnnwnw"},
			{38,	"wwwnnnnwnn"},
			{39,	"wnwwnnnwnn"},
			{40,	"nnnnwwnwwn"},
			{41,	"nwnnwnnnww"},
			{42,	"nnnwwnnnww"},
			{43,	"nwnwwnnnwn"},
			{44,	"nnnnwwnnww"},
			{45,	"nwnnwwnnwn"},
			{46,	"nnnwwwnnwn"},
			{47,	"nnnnwnnwww"},
			{48,	"nwnnwnnwwn"},
			{49,	"nnnwwnnwwn"},
			{50,	"wnnnwwnwnn"},
			{51,	"wwnnwnnnnw"},
			{52,	"wnnwwnnnnw"},
			{53,	"wwnwwnnnnn"},
			{54,	"wnnnwwnnnw"},
			{55,	"wwnnwwnnnn"},
			{56,	"wnnwwwnnnn"},
			{57,	"wnnnwnnwnw"},
			{58,	"wwnnwnnwnn"},
			{59,	"wnnwwnnwnn"},
			{60,	"nnwnwwnwnn"},
			{61,	"nwwnwnnnnw"},
			{62,	"nnwwwnnnnw"},
			{63,	"nwwwwnnnnn"},
			{64,	"nnwnwwnnnw"},
			{65,	"nwwnwwnnnn"},
			{66,	"nnwwwwnnnn"},
			{67,	"nnwnwnnwnw"},
			{68,	"nwwnwnnwnn"},
			{69,	"nnwwwnnwnn"},
			{70,	"nnnnnwwwwn"},
			{71,	"nwnnnnwnww"},
			{72,	"nnnwnnwnww"},
			{73,	"nwnwnnwnwn"},
			{74,	"nnnnnwwnww"},
			{75,	"nwnnnwwnwn"},
			{76,	"nnnwnwwnwn"},
			{77,	"nnnnnnwwww"},
			{78,	"nwnnnnwwwn"},
			{79,	"nnnwnnwwwn"},
			{80,	"wnnnnwwwnn"},
			{81,	"wwnnnnwnnw"},
			{82,	"wnnwnnwnnw"},
			{83,	"wwnwnnwnnn"},
			{84,	"wnnnnwwnnw"},
			{85,	"wwnnnwwnnn"},
			{86,	"wnnwnwwnnn"},
			{87,	"wnnnnnwwnw"},
			{88,	"wwnnnnwwnn"},
			{89,	"wnnwnnwwnn"},
			{90,	"nnwnnwwwnn"},
			{91,	"nwwnnnwnnw"},
			{92,	"nnwwnnwnnw"},
			{93,	"nwwwnnwnnn"},
			{94,	"nnwnnwwnnw"},
			{95,	"nwwnnwwnnn"},
			{96,	"nnwwnwwnnn"},
			{97,	"nnwnnnwwnw"},
			{98,	"nwwnnnwwnn"},
			{99,	"nnwwnnwwnn"},
		};
		
		IntString&inf=infs[ch];

		int i;
		for(i=0;i<10;i++)
		{
			if(inf.psz[i]=='w')	*pb+=2;
			if(i%2==0)			*pb+=1;
			pb++;
		}
		return pb;
	}
};

class Barcode93:public BarcodeBase
{
	//[n/a][n/a][n/a][n/a][n/a][n/a][n/a][b-s]
public:
	Barcode93()
	{
	}
	~Barcode93()
	{
	}

	BOOL Encode93(const char* pszCode)
	{
		Clear();
		const int iNum=strlen(pszCode);

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

		pb=P_GetBarSpace93(pb,47);
		if(pb==0)	return 0;

		BOOL b;
		int i,iFirst,iSecond;
		for(i=0;i<iNum;i++)
		{
			b=P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);
			if(b==0)	return 0;
			
			pb=P_GetBarSpace93(pb,iFirst);
			if(pb==0)	return 0;

			if(iSecond!=-1)
			{
				pb=P_GetBarSpace93(pb,iSecond);
				if(pb==0)	return 0;
			}
		}

		pb=P_GetCheckDigits(pb,pszCode);
		if(pb==0)	return 0;

		pb=P_GetBarSpace93(pb,48);
		if(pb==0)	return 0;

		i_LenBuf=pb-pFst;
		return 1;
	}

	void Draw93(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:
	BYTE*P_GetBarSpace93(BYTE*pb,int ch)
	{
		if(ch<0)	return 0;
		if(ch>48)	return 0;

		IntString infs[]=
		{
			{0,		"bsssbsbss"},
			{1,		"bsbssbsss"},
			{2,		"bsbsssbss"},
			{3,		"bsbssssbs"},
			{4,		"bssbsbsss"},
			{5,		"bssbssbss"},
			{6,		"bssbsssbs"},
			{7,		"bsbsbssss"},
			{8,		"bsssbssbs"},
			{9,		"bssssbsbs"},
			{10,	"bbsbsbsss"},
			{11,	"bbsbssbss"},
			{12,	"bbsbsssbs"},
			{13,	"bbssbsbss"},
			{14,	"bbssbssbs"},
			{15,	"bbsssbsbs"},
			{16,	"bsbbsbsss"},
			{17,	"bsbbssbss"},
			{18,	"bsbbsssbs"},
			{19,	"bssbbsbss"},
			{20,	"bsssbbsbs"},
			{21,	"bsbsbbsss"},
			{22,	"bsbssbbss"},
			{23,	"bsbsssbbs"},
			{24,	"bssbsbbss"},
			{25,	"bsssbsbbs"},
			{26,	"bbsbbsbss"},
			{27,	"bbsbbssbs"},
			{28,	"bbsbsbbss"},
			{29,	"bbsbssbbs"},
			{30,	"bbssbsbbs"},
			{31,	"bbssbbsbs"},
			{32,	"bsbbsbbss"},
			{33,	"bsbbssbbs"},
			{34,	"bssbbsbbs"},
			{35,	"bssbbbsbs"},
			{36,	"bssbsbbbs"},
			{37,	"bbbsbsbss"},
			{38,	"bbbsbssbs"},
			{39,	"bbbssbsbs"},
			{40,	"bsbbsbbbs"},
			{41,	"bsbbbsbbs"},
			{42,	"bbsbsbbbs"},
			{43,	"bssbssbbs"},
			{44,	"bbbsbbsbs"},
			{45,	"bbbsbsbbs"},
			{46,	"bssbbssbs"},
			{47,	"bsbsbbbbs"},
			{48,	"bsbsbbbbsb"},
		};
		
		IntString&inf=infs[ch];
		int i;
		for(i=0;i<9;i++)
		{
			if(inf.psz[i]=='b')	*pb+=1;
			pb++;
		}

		if(ch==48)
		{
			*pb+=1;
			pb++;
		}
		return pb;
	}

private:
	BYTE*P_GetCheckDigits(BYTE*pb,const char*&pszCode)
	{
		int i,iSum,iWeight,iFirst,iSecond;
		
		// "C" check digit character
		iWeight=1;
		iSum=0;

		const int iNum=strlen(pszCode);

		for(i=iNum-1;i>-1;i--)
		{
			P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);

			iSum+=(iWeight*iFirst);
			iWeight++;
			if(iWeight>20)	iWeight=1;

			if(iSecond!=-1)
			{
				iSum+=(iWeight*iSecond);
				iWeight++;
				if(iWeight>20)	iWeight=1;
			}
		}

		pb=P_GetBarSpace93(pb,iSum%47);
		if(pb==0)	return 0;

		iWeight=2;
		iSum=iSum%47;
		for(i=iNum-1;i>-1;i--)
		{
			P_AscIItoCode93Sequence((int)pszCode[i],iFirst,iSecond);

			iSum +=(iWeight * iFirst);
			iWeight++;
			if(iWeight>15)	iWeight=1;

			if(iSecond!=-1)
			{
				iSum +=(iWeight * iSecond);
				iWeight++;
				if(iWeight>15)	iWeight=1;
			}
		}

		pb=P_GetBarSpace93(pb,iSum%47);
		if(pb==0)	return 0;

		return pb;
	}

	BOOL P_AscIItoCode93Sequence(int iValue,int&iFirst,int&iSecond)
	{
		if(iValue<0)	return 0;
		if(iValue>127)	return 0;

		struct	I3{int iV,iFirst,iSecond;};
		
		I3 i3s[]=
		{
			{0,	44,	30},
			{1,	43,	10},
			{2,	43,	11},
			{3,	43,	12},
			{4,	43,	13},
			{5,	43,	14},
			{6,	43,	15},
			{7,	43,	16},
			{8,	43,	17},
			{9,	43,	18},
			{10,43,	19},
			{11,43,	20},
			{12,43,	21},
			{13,43,	22},
			{14,43,	23},
			{15,43,	24},
			{16,43,	25},
			{17,43,	26},
			{18,43,	27},
			{19,43,	28},
			{20,43,	29},
			{21,43,	30},
			{22,43,	31},
			{23,43,	32},
			{24,43,	33},
			{25,43,	34},
			{26,43,	35},
			{27,44,	10},
			{28,44,	11},
			{29,44,	12},
			{30,44,	13},
			{31,44,	14},
			{32,38,	-1},
			{33,45,	10},
			{34,45,	11},
			{35,45,	12},
			{36,39,	-1},
			{37,42,	-1},
			{38,45,	15},
			{39,45,	16},
			{40,45,	17},
			{41,45,	18},
			{42,45,	19},
			{43,41,	-1},
			{44,45,	21},
			{45,36,	-1},
			{46,37,	-1},
			{47,40,	-1},
			{48,0,	-1},
			{49,1,	-1},
			{50,2,	-1},

⌨️ 快捷键说明

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