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 + -
显示快捷键?