📄 barcode.h
字号:
#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 + -